其他分享
首页 > 其他分享> > 编组带有字符串的结构时,PInvoke错误

编组带有字符串的结构时,PInvoke错误

作者:互联网

我有一个C结构

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

和一个C#结构

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 *和string,则此函数调用有效.

解决方法:

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

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

标签:interop,marshalling,c,c-4,pinvoke
来源: https://codeday.me/bug/20191107/2003272.html