我在 C++ 中有以下内容:
struct TestA {
int i;
char text[512];
};
struct TestB {
double n;
char text[512];
};
union TestUnion {
struct TestA a;
struct TestB b;
};
int fnUnmanagedDLL(int which,TestUnion *);
我尝试像这样声明一个 C# 包装器:
public class WrapperClass
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct TestA
{
public int i;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)]
public string text;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct TestB
{
public double n;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)]
public string text;
}
[StructLayout(LayoutKind.Explicit)]
public struct TestUnion
{
[FieldOffset(0)]
public TestA a;
[FieldOffset(0)]
public TestB b;
}
[DllImport("UnmanagedDLL.Dll")]
public static extern int fnUnmanagedDLL(int which,ref TestUnion obj);
}
一旦我运行一个引用 WrapperClass.TestUnion 的程序,我就会得到“无法从程序集 'UnmanagedToManaged,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 加载类型 'TestUnion',因为它在偏移量处包含一个对象字段0 未正确对齐或被非对象字段重叠。”。
这只是一个测试程序。我确实在另一个问题中看到了删除联合的建议。但是,我不知道DLL会提前填充哪个结构。任何人都可以就我做错了什么提供建议吗?