我有一个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,则此函数调用有效。
答案 0 :(得分:4)
对于此类场景,请勿直接使用String。而是将类型切换为IntPtr值,并根据需要使用Marshal.PtrToStringAuto / Ansi / Uni。在这种情况下,由于您的本机代码使用char*
,因此PtrToStringAnsi是最佳选择。
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}