2010-03-04 7 views
5

Ho una semplice applicazione che carica una dll non gestita e passa ad essa alcuni valori stringa da C#. Ma nell'applicazione dll C++, ricevo un'eccezione :: Ho cercato di accedere a una memoria protetta in lettura/scrittura. Il mio DLL Import si presenta così:Passare la stringa C# a una DLL C++ non gestita

[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] 
public static extern int 
DumpToDBLogFile([MarshalAs(UnmanagedType.I4)]int loggingLevel, 
       [MarshalAs(UnmanagedType.I4)]int jobId, 
       int threadId, 
       [MarshalAs(UnmanagedType.LPStr)]string procName, 
       [MarshalAs(UnmanagedType.LPStr)]string message); 

e dichiarazione di C++ è come

extern "C"  
__declspec(dllexport) int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, string procName, string message) 
{ 
    //access strings.. 
} 

Aiuto per favore !!!

+0

Sembra che il codice in C++ non sia in grado di accedere all'heap in C#. – Kangkan

risposta

7
string != LPStr 

prova:

extern "C" 
__declspec(dllexport) int DumpToDBLogFile(int loggingLevel, int jobId, int threadId, char* procName, char* message) { //access strings.. 

} 
+0

Questo è corretto. Cambia la dichiarazione della funzione sul lato C++ per accettare un char raw * invece di uno std :: string. –

+0

Ho cambiato la dichiarazione in char * e ha funzionato. Ma dovrei deallocare il char * da C++ una volta che ho finito. Se non lo farei, il risultato sarà una perdita di memoria .. ?? – Prabhu

+0

Grazie mille ragazzi. Ho lottato con questo problema per molto tempo. :( – DynamicScope

2

vorrei modificare la firma PInvoke ....

 
[DllImport("X.dll", CallingConvention = CallingConvention.Cdecl) ] 
public static extern int 
DumpToDBLogFile(int loggingLevel, int jobId, int threadId, StringBuilder procName, StringBuilder message); 

E dal lato gestito utilizzare la classe StringBuilder inizializzata ....

 
StringBuilder sbProcName = new StringBuilder(1024); 
StringBuilder sbMessage = new StringBuilder(1024); 

Quindi passare il sbProcName e sbMessage al DumpToDBLogFile ...

Spero che questo aiuti, i migliori saluti, Tom.