编组包含 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++ 库公开了UnmanagedStruct
getStruct();
【问题讨论】:
【参考方案1】:编辑和更正:对于 p/invoke 调用的返回值,“正常”方法不起作用。我已经习惯了与方法参数相关的正常的ref
和out
行为,我认为返回值将以类似的方式工作。以下是返回值问题的解决方法链接: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++