2010-03-04 48 views
5

我有一個簡單的應用程序,加載一個非託管的dll並從C#傳遞幾個字符串值。但在C++的dll應用程序中,我收到一個異常::嘗試訪問讀/寫保護內存。我的DLL導入看起來是這樣的:傳遞c#字符串到非託管的c + + DLL

[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); 

和C++宣言就像

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

請幫助!

+0

似乎C++中的代碼無法訪問c#中的堆。 – Kangkan 2010-03-04 15:52:47

回答

7
string != LPStr 

嘗試:

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

} 
+0

這是正確的。將C++端的函數聲明更改爲接受原始char *而不是std :: string。 – 2010-03-04 15:59:50

+0

我將聲明更改爲char *並且它工作正常。但是,一旦完成,我應該從C++中釋放char *。如果我不會導致內存泄漏.. ?? – Prabhu 2010-03-05 06:46:10

+0

非常感謝你們。我很長時間以來一直在努力解決這個問題。 :( – DynamicScope 2011-07-15 06:10:58

2

我會修改的PInvoke簽名....

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

而且從管理端使用初始化StringBuilder類....

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

然後通過sbProcNamesbMessageDumpToDBLogFile ...

希望這有助於 最好的問候, 湯姆。

相關問題