2010-04-24 15 views
5

Buenas tardes,PInvoke desequilibra la pila

He estado trabajando en un DLL que se puede usar CORBA para comunicar a una aplicación que es consciente de la red. El código funciona bien si lo ejecuto como una aplicación de consola C++. Sin embargo, me he atascado al exportar los métodos como dll. Los métodos parecen exportar bien, y si invoco un método sin parámetros, funciona como se esperaba. Estoy pendiente de pasar una cadena C# a un método C++.

Mi C cabecera del método ++ es el siguiente:

bool __declspec(dllexport) SpiceStart(char* installPath) 

Mi C# código de importación DLL es la siguiente:

[DllImportAttribute("SchemSipc.dll", CharSet=CharSet.Ansi)] 
private static extern bool SpiceStart(string installPath); 

que llamo el método de este modo:

bool success = SpiceStart(@"c:\sedatools"); 

El llamada a SpiceStart arroja la excepción "PInvokeStackImbalance", que "es probable porque la firma PInvoke administrada no coincide con la firma del objetivo no administrado ".

¿Alguien tiene alguna sugerencia? Si elimino el char * y la cadena de los parámetros, entonces el método funciona bien. Sin embargo, me gustaría poder pasar la ruta de instalación de la aplicación al dll desde C#.

Gracias de antemano,

Giawa

Respuesta

10

Las convenciones de llamada no coinciden. En C++, declarar la función con la convención de llamada stdcall:

extern "C" bool __declspec (dllexport) __stdcall SpiceStart (char * installPath)

+3

1. O especifique la convención de llamadas en DllImportAttribute. –

+0

Perfecto - ¡Eso hizo el trabajo! Gracias – Giawa

Cuestiones relacionadas