2010-04-24 7 views
5

Bonjour,PInvoke balourds la pile

Je travaille sur une dll qui peut utiliser CORBA pour communiquer à une application qui est sensible au réseau. Le code fonctionne correctement si je l'exécute en tant qu'application de console C++. Cependant, je suis resté bloqué sur l'exportation des méthodes en tant que DLL. Les méthodes semblent bien exporter, et si j'appelle une méthode sans paramètres, cela fonctionne comme prévu. Je suis raccroché en passant une chaîne C# à une méthode C++.

Mon C++ en-tête de la méthode ressemble à ceci:

bool __declspec(dllexport) SpiceStart(char* installPath) 

Mon C# Code d'importation DLL est comme suit:

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

j'appelle la méthode comme ceci:

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

Le call to SpiceStart lève l'exception "PInvokeStackImbalance", ce qui "est probable car la signature PInvoke gérée ne correspondre à la signature cible non gérée. "

Quelqu'un a-t-il des suggestions? Si je supprime le char * et la chaîne des paramètres, alors la méthode fonctionne très bien. Cependant, j'aimerais pouvoir passer le chemin d'installation de l'application à la DLL de C#.

Merci à l'avance,

Giawa

Répondre

10

Les conventions d'appel ne correspondent pas. En C++, déclarer la fonction avec la convention d'appel stdcall:

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

+3

+1. Ou spécifiez la convention d'appel dans DllImportAttribute. –

+0

Parfait - Cela a fait le travail! Merci – Giawa