我在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);它还我一杯
îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ2§{€ûW@_‹p
在.net 4.0中,但是在.net 3.5中工作得很好。
注:
charset=...(所有可能的设置,例如Charset.Unicode)在DllImport中。IntPtr而不是string,然后使用Marshal.PtrToStringAnsi将其转换回string。StringBuilder而不是string。以上所有的解决方案都不起作用。
发布于 2014-06-04 05:20:10
如果您是C++代码的所有者,则可以修改函数,使其将字符串作为out参数返回:
extern "C" __declspec(dllexport) void __stdcall GetId(
const My_Polyhedron *obj, char* result);然后在C#中使用此导入:
[DllImport("polyhedra.dll", CallingConvention = CallingConvention.Cdecl)]
static private extern void GetId(IntPtr obj, StringBuilder result);请注意,result是StringBuilder而不是string。
您必须首先通过使StringBuilder足够大来分配足够的空间。
就这样说吧:
StringBuilder result = new StringBuilder(1000);
GetId(obj, result);使用result.ToString()获取字符串。
有一个return属性(实际上不是一个属性),它指定如何封送返回的值:
[return: MarshalAs(UnmanagedType.Bool)]但我没有在你的密码上试过。
也许这有帮助..。
https://stackoverflow.com/questions/23537359
复制相似问题