DLLimport返回gobbledygook

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中运行良好.

注意:

  1. 我已尝试charset=...(所有可能的设置,例如Charset.Unicode)DllImport.

  2. 我试图让它返回IntPtr而不是string,然后使用Marshal.PtrToStringAnsi转换回来string.

  3. 我试过StringBuilder而不是string.

上面的所有解决方案都不起作用.

joe*_*joe 0

如果您是 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)

但我没有在你的代码上尝试过。
也许这有帮助...