问题很简单,想要在WCHAR* []
中读取托管C#代码中的字符串到我的非托管C ++代码。
C函数是:
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 :(得分:1)
看起来你的C函数需要一个字符串数组,而你传递的是一个字符串。
我自己没有使用过P / Invoke,但这个question可能会提供一些见解。
答案 1 :(得分: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,然后执行操作。
答案 2 :(得分:0)
如果您使用的是WCHAR*
,或许您应该尝试编组为UnmanagedType.LPWStr
,以避免传递一半的内存,而不是预期?
Default Marshaling for Strings上的文档应该为您提供更多详细信息。