编组包含 c 字符串的结构

Posted

技术标签:

【中文标题】编组包含 c 字符串的结构【英文标题】:Marshalling a struct containing c-strings 【发布时间】:2009-07-31 23:19:23 【问题描述】:

我有一个 C++ 结构

struct UnmanagedStruct

   char* s;
;

和一个 C# 结构

struct ManagedStruct 
   string s;

如何编组UnmanagedStruct?我需要使用 StringBuilder 吗?

C++ 库公开了UnmanagedStructgetStruct();

【问题讨论】:

【参考方案1】:

编辑和更正:对于 p/invoke 调用的返回值,“正常”方法不起作用。我已经习惯了与方法参数相关的正常的refout 行为,我认为返回值将以类似的方式工作。以下是返回值问题的解决方法链接:PInvoke error when marshalling struct with a string in it

如果您将结构作为 byref 参数传递给 C++ 方法,并且字符串是该方法将更改的缓冲区,则只需使用 StringBuilder。对于返回值,您只需要指定字符串的类型,在这种情况下为:

struct ManagedStruct

    [MarshalAs(UnmanagedType.Lpstr)]
    string s;

记得添加一个属性来公开字符串,因为s在这里是私有的(没关系,字段应该是私有的)。

【讨论】:

在仅用于 P/Invoke 目的的结构中公开字段并没有错。无论如何,所有的访问器都是微不足道的,而且这在未来也不会改变,那为什么还要写更多的代码呢? 我试过了,但我不断收到 Method's type signature is not PInvoke compatible 阅读微软帮助它说“ANSI 字符串必须使用 IntPtr 进行编组并作为字节数组传递。” @SteveM,有什么帮助?请给个链接很可能是针对某些极端情况,此处不适用。 @Pavel 这里是链接msdn.microsoft.com/en-us/library/ms172514.aspx 我也像这样导入DLL [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)] static extern ManagedStruct function( string input );在 DLL 中,函数是 extern "C" UnmanagedStruct __declspec(dllexport) function(char* input);再次感谢您的帮助。

以上是关于编组包含 c 字符串的结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中编组指向一系列以 null 结尾的字符串的指针?

包含字节数组的编组结构

将包含 int 和 int[] 的结构从 C# 编组到 C++

创建要在 C# 中编组的 C++ Dll 的最佳实践 [关闭]

导出的 C 函数与结构与 .Net 编组中的布尔大小

将结构切片编组为数字切片