在编组带有字符串的struct时出现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 * s和字符串s,则此函数调用有效。

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

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