我有一个 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 和 string s,则此函数调用有效。
最佳答案
对于这种场景,不要直接使用String。而是将类型切换为 IntPtr 值并根据需要使用 Marshal.PtrToStringAuto/Ansi/Uni。在这种情况下,由于您的 native 代码使用 char*
,因此 PtrToStringAnsi 是最佳选择。
struct ManagedStruct {
IntPtr s;
public string sAsString { get { return Marshal.PtrToStringAnsi(s); } }
}
关于c# - 使用其中的字符串编码结构时出现 PInvoke 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1223690/