C# DLLimport返回gobbledygook 我在C++头文件< /p>中有这个定义 extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);
这是用C写的# 它还让我狼吞虎咽 238方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方238方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮崮þîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ2§{€ûW@_èp 在.NET4.0中,但它在.NET3.5中运行良好 注意:C# DLLimport返回gobbledygook 我在C++头文件< /p>中有这个定义 extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);,c#,.net,.net-4.0,pinvoke,C#,.net,.net 4.0,Pinvoke,这是用C写的# 它还让我狼吞虎咽 238方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方
DllImport
中尝试了charset=…
(所有可能的设置,例如charset.Unicode
)IntPtr
而不是string
,然后使用marshall.PtrToStringAnsi
将其转换回string
StringBuilder
而不是string
上述所有解决方案都不起作用。
< P>如果你是C++代码的所有者,你可以修改函数,使它返回字符串为OUT参数:extern "C" __declspec(dllexport) void __stdcall GetId(
const My_Polyhedron *obj, char* result);
然后在C#中使用此导入:
请注意,result
是StringBuilder
而不是string
您必须首先通过使StringBuilder足够大来分配足够的空间 可以这样称呼:
StringBuilder result = new StringBuilder(1000);
GetId(obj, result);
使用result.ToString()
获取字符串
有一个
return
属性(它实际上不是一个属性)指定如何封送返回值:
[return: MarshalAs(UnmanagedType.Bool)]
但我没有在你的代码上试用过。也许这会有帮助…您是否也尝试过在两侧使用StdCall?@500 InternalServerError在.Net 4.0上,StdCall无法工作,它会引发PinVokesTack异常。我尝试关闭运行时异常,关闭后,它仍然返回goobledygook。在.Net 3.5上,Cdecl和StdCall都工作正常,返回我需要的正常字符串D.@ WiLaMe0.7:你有没有访问C++代码?我建议在本地模式下附加调试器。这里没有什么东西加起来。但是无论如何,返回这样的字符串肯定是错误的。封送器在返回的指针上调用<代码> COTASKMMESFORE /COMPUTE。你确定你希望这样吗?
StringBuilder result = new StringBuilder(1000);
GetId(obj, result);
[return: MarshalAs(UnmanagedType.Bool)]