2011-12-22 55 views
0

問題很簡單,想從託管C#代碼讀取字符串到我的非託管C++代碼WCHAR* []。 C函數是:從C#託管代碼讀取字符串到C++ wchar * []越來越AccessViolation

extern "C" __declspec(dllexport) int __cdecl myfunc(int argc, WCHAR* argv[]) 

,並在C#我導入的DLL:

[DllImport("mydll.dll", CharSet = CharSet.Auto, SetLastError = true, CallingConvention = CallingConvention.Cdecl)] 
public static extern int myfunc(int argc, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder str); 

我跑,但是當我試圖讀取串在我的C++代碼,我得到AccessViolationException : Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

什麼是正確的方法來做到這一點,反之亦然(即傳遞字符串從C託管非託管C#託管代碼)?

幫助讚賞。 謝謝

+0

C#端應該可能使用StringBuilder。 – 2011-12-22 12:38:34

+0

弗拉德是正確的。 C函數需要一個指向WCHAR的指針數組。 – jlvaquero 2011-12-22 13:29:07

回答

1

看來你的C函數需要一個字符串數組,而你傳遞的是單個字符串。

我還沒有使用P/Invoke自己,但這question可能提供一些見解。

0

我不確定C#到C++,但我可以幫助你在你的C++到C#的問題。

導出功能從C++代碼:

DllExport std::string MyFunction(std::string MyParameter) ; 

這可以在你的C#代碼導入爲:現在

[DllImport("DLLName.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] 
    [return: MarshalAs(UnmanagedType.LPStr)] 
    public static extern string MyFunction([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] string MyParameter); 

,在C#代碼的函數 「MyFunction」 將帶在一個字符串中並返回一個字符串。然後您可以調用MyFunction並執行操作。

0

如果您使用的是WCHAR*,或許您應該嘗試編組爲UnmanagedType.LPWStr,以避免傳遞一半的預期內存?

關於Default Marshaling for Strings的文檔應該會爲您提供更多詳細信息。