在一个字符串编组结构时的PInvoke错误(PInvoke error when marshalli

2019-06-27 17:08发布

我有一个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。

Answer 1:

对于这种类型的情况下,不直接使用字符串。 代替切换到是一个IntPtr值,并使用Marshal.PtrToStringAuto / ANSI / UNI适当的类型。 在这种情况下,由于您的本机代码使用char* ,PtrToStringAnsi是最好的选择。

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


文章来源: PInvoke error when marshalling struct with a string in it