编组包含 c 字符串的结构

Dev*_*Dev 6 c# c++ pinvoke marshalling

我有一个 C++ 结构

struct UnmanagedStruct
{
   char* s;
};
Run Code Online (Sandbox Code Playgroud)

和一个 C# 结构体

struct ManagedStruct {
   string s;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能编组UnmanagedStruct?我需要使用 StringBuilder 吗?

C++ 库公开UnmanagedStructgetStruct();

Sam*_*ell 1

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

StringBuilder仅当您将结构作为 byref 参数传递给 C++ 方法并且字符串是该方法将更改的缓冲区时,才需要使用 a 。对于返回值,您只需要指定字符串的类型,在本例中为:

struct ManagedStruct
{
    [MarshalAs(UnmanagedType.Lpstr)]
    string s;
}
Run Code Online (Sandbox Code Playgroud)

请记住添加一个属性来公开字符串,因为s这里是私有的(这是可以的,字段应该是私有的)。

  • 在仅用于 P/Invoke 目的的结构中公开字段并没有什么问题。无论如何,所有访问器都是微不足道的,而且这在未来永远不会改变,那么为什么要编写更多代码呢? (2认同)