从C#托管代码读取字符串到C ++ wchar * []获取AccessViolation

时间:2011-12-22 11:52:43

标签: c# managed wchar

问题很简单,想要在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#托管代码)?

帮助感谢。 感谢

3 个答案:

答案 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上的文档应该为您提供更多详细信息。