在类似联合的结构

时间:2016-07-20 13:04:15

标签: c# marshalling unions

我正在尝试使用byte []字段创建类似于union的结构。因此,下一个类型声明会在运行时导致错误:

    [StructLayout(LayoutKind.Explicit)]
public struct Int64ByteArr
{
    [FieldOffset(0)]
    public UInt64 u64;
    [FieldOffset(0)]
    public Int64 s64;
    [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]        
    public byte[] bytes;
}

当调用使用该类型变量的函数时,程序会导致该描述的异常:

  

Необработанноеисключениетипа“System.TypeLoadException”вSystem.Windows.Forms.dll   Дополнительныесведения:Неудалосьзагрузитьтип “Int64ByteArr” изсборки “ChalengeCalc,版本= 1.0.0.0,文化=中性公钥=空”,таккаконсодержитполеобъектасосмещением0,котороеневерновыровненоилиперекрытополем,непредставляющимобъект

     

英语翻译:System.Windows.Forms.dll中类型为“System.TypeLoadException”的未处理异常   附加信息:无法从“ChalengeCalc,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”加载类型“Int64ByteArr”程序集导致它包含具有oaffset 0的对象字段,该字段未正确对齐溢出的字段一个对象

我也试试这个变种:

    [StructLayout(LayoutKind.Sequential)]
public struct ByteArr8
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
    public byte[] bytes;
    public Byte this[int idx]
    {
        get
        {
            if (idx < 0 || idx > 7) return 0;
            return bytes[idx];
        }
        set
        {
            if (idx < 0 || idx > 7) return;
            bytes[idx] = value;
        }
    }
}
[StructLayout(LayoutKind.Explicit)]
public struct Int64ByteArr
{
    [FieldOffset(0)]
    public UInt64 u64;
    [FieldOffset(0)]
    public Int64 s64;
    [FieldOffset(0)]
    public ByteArr8 bytes;
}

它挂起了同样的例外。所以有一个问题:“怎么样?”

1 个答案:

答案 0 :(得分:1)

在您的特定情况下,您可以仅封送字节数组字段并为其他字段提供getter / setter:

std::basic_string<>

注意:受David Heffernan对this question的评论的启发。

一般情况下,你必须使用自定义封送,我相信。