首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DLLimport返回gobbledygook

DLLimport返回gobbledygook
EN

Stack Overflow用户
提问于 2014-05-08 09:06:21
回答 1查看 91关注 0票数 5

我在C++头文件中有这个定义

代码语言:javascript
复制
extern "C" __declspec(dllexport) const char* __stdcall GetId(const My_Polyhedron *obj);

并且在C#中有这个

代码语言:javascript
复制
[DllImport("polyhedra.dll", CallingConvention = CallingConvention.Cdecl)]      
        static private extern string GetId(IntPtr obj);

它还我一杯

îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ2§{€ûW@_‹p

在.net 4.0中,但是在.net 3.5中工作得很好。

注:

  1. 我尝试过charset=...(所有可能的设置,例如Charset.Unicode)在DllImport中。
  2. 我尝试让它返回IntPtr而不是string,然后使用Marshal.PtrToStringAnsi将其转换回string
  3. 我试过StringBuilder而不是string

以上所有的解决方案都不起作用。

EN

回答 1

Stack Overflow用户

发布于 2014-06-04 05:20:10

如果您是C++代码的所有者,则可以修改函数,使其将字符串作为out参数返回:

代码语言:javascript
复制
extern "C" __declspec(dllexport) void __stdcall GetId(
                  const My_Polyhedron *obj, char* result);

然后在C#中使用此导入:

代码语言:javascript
复制
[DllImport("polyhedra.dll", CallingConvention = CallingConvention.Cdecl)]      
static private extern void GetId(IntPtr obj, StringBuilder result);

请注意,resultStringBuilder而不是string

您必须首先通过使StringBuilder足够大来分配足够的空间。

就这样说吧:

代码语言:javascript
复制
StringBuilder result = new StringBuilder(1000);
GetId(obj, result);

使用result.ToString()获取字符串。

有一个return属性(实际上不是一个属性),它指定如何封送返回的值:

代码语言:javascript
复制
[return: MarshalAs(UnmanagedType.Bool)]

但我没有在你的密码上试过。

也许这有帮助..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23537359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档