我有一个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); } }
}