【发布时间】:2014-06-25 14:02:19
【问题描述】:
我在 C++ 头文件中有这个定义
extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);
在 C# 中有这个
[DllImport("polyhedra.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern string GetId(IntPtr obj);
它返回给我 gobbledygook
îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ2§{€UW @_
在 .net 4.0 中,但在 .net 3.5 中运行良好。
注意:
我已经在
DllImport中尝试了charset=...(所有可能的设置,例如Charset.Unicode)。我试图让它返回
IntPtr而不是string,然后使用Marshal.PtrToStringAnsi将它转换回string。我试过
StringBuilder而不是string。
上述所有解决方案均无效。
【问题讨论】:
-
您是否也尝试过在双方都使用 StdCall?
-
@500-InternalServerError 在 .Net 4.0 上,StdCall 无法工作,它会引发 PInvokeStackUnbalance 异常。我尝试关闭运行时异常,关闭后仍然返回goobledygook。在 .Net 3.5 上,Cdecl 和 StdCall 都运行良好,返回我需要的正常字符串。
-
@william007:您可以访问 C++ 代码吗?我建议也以本机模式附加调试器。
-
这里没有加起来。但无论如何返回这样的字符串肯定是错误的。编组器将在返回的指针上调用
CoTaskMemFree。你确定要这样吗?