2010-04-24 2 views
5

Buon pomeriggio,PInvoke sbilancia lo stack

Ho lavorato su una dll che può utilizzare CORBA per comunicare a un'applicazione che è la rete a conoscenza. Il codice funziona bene se lo eseguo come un'applicazione di console C++. Tuttavia, mi sono bloccato sull'esportazione dei metodi come dll. I metodi sembrano esportare bene e, se chiamo un metodo senza parametri, funziona come previsto. Sono bloccato dal passaggio di una stringa C# a un metodo C++.

mio C metodo intestazione ++ si presenta così:

bool __declspec(dllexport) SpiceStart(char* installPath) 

mio codice C# DLL di importazione è la seguente:

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

chiamo il metodo in questo modo:

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

Il chiamata a SpiceStart genera l'eccezione "PInvokeStackImbalance", che "è probabile perché la firma PInvoke gestita non abbinare la firma del target non gestito. "

Qualcuno ha qualche suggerimento? Se rimuovo il char * e la stringa dai parametri, il metodo funziona perfettamente. Tuttavia, mi piacerebbe essere in grado di passare il percorso di installazione dell'applicazione alla DLL da C#.

Grazie in anticipo,

Giawa

risposta

10

Le convenzioni di chiamata non corrispondono. In C++, dichiarare la funzione con la convenzione di chiamata stdcall:

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

+3

+1. O specificare la convenzione di chiamata in DllImportAttribute. –

+0

Perfetto - Questo ha fatto il lavoro! Grazie – Giawa