编组包含c字符串的结构

时间:2009-07-31 23:19:23

标签: c# c++ pinvoke marshalling

我有一个C ++结构

struct UnmanagedStruct
{
   char* s;
};

和C#struct

struct ManagedStruct {
   [MarshalAs(UnmanagedType.LPStr)]
   string s;
}

C ++库公开

extern "C" UnmanagedStruct __declspec(dllexport) foo( char* input );

它像

一样导入
  [DllImport("SomeDLL.dll", CharSet = CharSet.Ansi)]
  static extern ManagedStruct foo( string input );

1 个答案:

答案 0 :(得分:0)

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

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

struct ManagedStruct
{
    [MarshalAs(UnmanagedType.Lpstr)]
    string s;
}

重新添加一个属性来公开字符串,因为s在这里是私有的(这是好的,字段应该是私有的)。