wil*_*007 5 .net c# pinvoke .net-4.0
我在C++头文件中有这个定义
extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);
Run Code Online (Sandbox Code Playgroud)
并在C#中有这个
[DllImport("polyhedra.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern string GetId(IntPtr obj);
Run Code Online (Sandbox Code Playgroud)
它让我失去了gobbledygook
îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ2§{€UW @_ <P
在.net 4.0中,但它在.net 3.5中运行良好.
注意:
我已尝试charset=...(所有可能的设置,例如Charset.Unicode)DllImport.
我试图让它返回IntPtr而不是string,然后使用Marshal.PtrToStringAnsi转换回来string.
我试过StringBuilder而不是string.
上面的所有解决方案都不起作用.
如果您是 C++ 代码的所有者,则可以修改该函数,使其返回字符串作为输出参数:
extern "C" __declspec(dllexport) void __stdcall GetId(
const My_Polyhedron *obj, char* result);
Run Code Online (Sandbox Code Playgroud)
然后在 C# 中使用此导入:
[DllImport("polyhedra.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern void GetId(IntPtr obj, StringBuilder result);
Run Code Online (Sandbox Code Playgroud)
请注意,result是 aStringBuilder而不是 a string。
您必须首先通过使 StringBuilder 足够大来分配足够的空间。
像这样称呼它:
StringBuilder result = new StringBuilder(1000);
GetId(obj, result);
Run Code Online (Sandbox Code Playgroud)
用于result.ToString()获取字符串。
有一个return属性(它不是真正的属性)指定如何编组返回值:
[return: MarshalAs(UnmanagedType.Bool)]
Run Code Online (Sandbox Code Playgroud)
但我没有在你的代码上尝试过。
也许这有帮助...