- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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 中运行良好。
注意:
我已经在 DllImport
中尝试了 charset=...
(所有可能的设置,例如 Charset.Unicode
)。
我试着让它返回IntPtr
而不是string
,然后使用Marshal.PtrToStringAnsi
将它转换回 >字符串
。
我已经尝试使用 StringBuilder
而不是 string
。
以上所有解决方案均无效。
最佳答案
如果您是 C++ 代码的所有者,您可以修改该函数,使其将字符串作为输出参数返回:
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)]
但是我没有在你的代码上试过。
也许这有助于...
关于c# - DLLimport 返回 gobbledygook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23537359/
我在 C++ 头文件中有这个定义 extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *o
在您看来,我仍然可能是一个自杀者,或者更合理地说,我只是一个想要学习如何不惜一切代价经营一家全局性大公司的 child :L 试图在窗口内制作一个文本输入控制台框,我使用了这个: textString
我有一个小标题,其中有一列格式为日期。出于问题的目的,我将生成类似的数据(真实数据要大得多!): > dates = tribble(~YrMon, "2011-01-01", "2011-02-01
我是一名优秀的程序员,十分优秀!