从C ++ union转换时,C#struct变量的类型错误

时间:2015-12-24 16:36:15

标签: c# c++ struct

我正在通过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中使用了值和引用类型而且

  

托管代码不允许值类型和引用类型重叠

有没有办法让我创建一个包含这两种类型的结构?有没有办法通过创建一个类型的结构来避免联合,该类型可以以某种方式外部转换为两种联合类型?

0 个答案:

没有答案