在一个字符串编组结构时的PInvoke错误
-
11-07-2019 - |
题
我有一个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调用这个函数的工作。
解决方案
有关这种类型的场景,不直接使用一个字符串。代替切换到是一个IntPtr值,并使用Marshal.PtrToStringAuto / ANSI / UNI适当的类型。在这种情况下,由于本机代码使用char*
,PtrToStringAnsi是最好的选择。
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
不隶属于 StackOverflow