2011-10-06 17 views
6

Sto provando a monitorare un'applicazione in esecuzione scritta in C++ utilizzando un'applicazione C# diversa.Chiamare le funzioni exe C++ da C#

Nel mio codice C++ ho definito un API:

_declspec(dllexport) //is this even possible when compiling an .exe? 
int getSomething(); 

C'è un modo per chiamare questa funzione dal codice C#?

Sarà il classico lavoro di approccio:

[DllImport("myexe.exe", CharSet = CharSet.Auto)] 
public static extern int getSomething(); 
+1

Hai provato? : D –

+1

Per rispondere alla prima domanda secondaria: Sì, gli eseguibili possono avere funzioni esportate. – GolezTrol

+3

per chiarimenti, anche se caricherete il modulo nel vostro processo personale non agganciati all '"applicazione in esecuzione" che state tentando di monitorare. Per farlo avrai bisogno di una sorta di IPC. – Yaur

risposta

4

Sì, qualsiasi eseguibile PE può esportare le funzioni in questo modo. Basta tenere a mente che il compilatore a volte storpiare i nomi di esportazione, con conseguente cose come questa:

[email protected] 

È possibile verificare che i nomi sono OK caricando il file eseguibile in uno strumento come PEInfo.

Si dovrebbe essere in grado di chiamarlo esattamente nello stesso modo in cui si farebbe una funzione in una DLL.

Aggiornamento Ok, quindi sembra che si desideri IPC, non una chiamata P/Invoke. Vedi this page per informazioni su come usare named pipe in C#. E here è un ottimo punto di partenza per cercare informazioni su come utilizzare named pipe in C++.

+0

In quale thread verrebbero eseguite le funzioni richiamate? –

+0

Il thread del chiamante. – Polynomial

+0

Chiamando, ad esempio, una funzione set cambia la rispettiva variabile nel processo C++? –

0

Sì, è possibile esportare le funzioni da un .exe esattamente come è possibile da un .dll e il modo in cui è stato mostrato è il modo corretto per farlo.

No, non è possibile interagire con un processo esistente in questo modo, proprio come il caricamento di una funzione da un .dll non consente di interagire con altri processi utilizzando tale .dll.