2011-10-06 41 views
6

Estoy intentando monitorear una aplicación en ejecución escrita en C++ utilizando una aplicación C# diferente.Llamar a las funciones de C++ exe desde C#

En mi código C++ he definido una API:

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

¿Hay una manera de llamar a esta función desde el código C#?

Será el clásico enfoque de trabajo:

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

¿Lo has probado? : D –

+1

Para responder la primera subpregunta: Sí, los ejecutables pueden tener funciones exportadas. – GolezTrol

+3

para aclarar que cargará el módulo en su propio proceso sin conectarlo a la "aplicación en ejecución" que está intentando monitorear. Para hacer eso necesitarás algún tipo de IPC. – Yaur

Respuesta

4

Sí, cualquier ejecutable PE puede exportar las funciones de esta manera. Hemos de tener en cuenta que el compilador veces será destrozar los nombres de exportación, lo que resulta en cosas como esta:

[email protected] 

Se puede comprobar que los nombres están bien cargando el archivo ejecutable en una herramienta como PEInfo.

Debería poder llamarlo exactamente de la misma manera que una función en una DLL.

Actualización Ok, parece que quiere IPC, no una llamada de P/Invoke. Consulte this page para obtener información sobre cómo usar tuberías con nombre en C#. Y here es un gran lugar para comenzar a buscar información sobre cómo usar los tubos con nombre en C++.

+0

¿Qué hilo ejecutarán las funciones llamadas? –

+0

El hilo de la persona que llama. – Polynomial

+0

¿Llamar, por ejemplo, a una función establecida cambia la variable respectiva en el proceso C++? –

0

Sí, puede exportar funciones desde .exe exactamente como puede desde .dll y la forma en que ha demostrado que es la forma correcta de hacerlo.

No, no puede interactuar con un proceso existente haciendo eso, del mismo modo que cargar una función desde un .dll no le permitiría interactuar con otros procesos usando ese .dll.