0

问题很简单,想从托管 C# 代码中读取一个字符串到我的非托管 C++ 代码中WCHAR* []。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# 托管代码)?

帮助赞赏。谢谢

4

3 回答 3

1

似乎您的 C 函数需要一个字符串数组,而您正在传递一个字符串。

我自己没有使用过 P/Invoke,但这个问题可能会提供一些见解。

于 2011-12-22T12:02:28.623 回答
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 并执行操作。

于 2011-12-22T12:24:04.690 回答
0

如果您使用的是 a WCHAR*,也许您应该尝试编组 asUnmanagedType.LPWStr以避免传递预期一半的内存?

字符串默认封送处理的文档应该为您提供更多详细信息。

于 2011-12-22T13:27:26.870 回答