我正在通过C#代码访问外部C ++ DLL。 API指定以下函数
BOOL WINAPI Foo(RESULT_TYPE *pOut);
RESULT_TYPE
的定义如下:
typedef struct {
unsigned result;
unsigned length;
union {
// result message
BYTE message[4096 + 1];
// option selection
OPTION option[21];
} extra;
} RESULT_TYPE;
typedef struct {
BYTE available : 1;
BYTE label[20];
} OPTION;
我通过DLLImport
导入了该功能:
[DllImport(..., CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern bool Foo(ref RESULT_TYPE pOut);
“my”RESULT_TYPE
以这种方式定义:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct RESULT_TYPE
{
public int result;
public int length;
public RESULT_Extra extra;
}
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Auto)]
public struct RESULT_Extra
{
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4097)]
public byte[] message;
[FieldOffset(0)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public OPTION[] option;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct OPTION
{
public byte available;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] label;
}
在运行时会发生什么,在执行Foo
时,我的RESULT_TYPE.extra.message
变量包含一个OPTION
数组,而不是一个字节数组。从option
移除RESULT_Extra
变量会导致此行为消失,但我确实需要option
...
我已经尝试过尝试和研究,我能想到的最接近的问题是here提到的问题 - 我在重叠的RESULT_Extra中使用了值和引用类型而且
托管代码不允许值类型和引用类型重叠
有没有办法让我创建一个包含这两种类型的结构?有没有办法通过创建一个类型的结构来避免联合,该类型可以以某种方式外部转换为两种联合类型?