在编组带有字符串的struct时出现PInvoke错误

时间:2009-08-03 17:52:26

标签: c# c++ interop pinvoke marshalling

我有一个C ++结构

struct UnmanagedStruct
{
   char* s;
   // Other members
};

和C#struct

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

C ++库公开

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

它像

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

然而,当我调用此函数时,我得到了

MarshalDirectiveException未处理

方法的类型签名与PInvoke不兼容。

问题是,如果我从结构中删除char * s和字符串s,则此函数调用有效。

1 个答案:

答案 0 :(得分:4)

对于此类场景,请勿直接使用String。而是将类型切换为IntPtr值,并根据需要使用Marshal.PtrToStringAuto / Ansi / Uni。在这种情况下,由于您的本机代码使用char*,因此PtrToStringAnsi是最佳选择。

struct ManagedStruct {
  IntPtr s;
  public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}