在编组带有字符串的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); } } }