C# 如何在FieldOffset=0的结构中创建数组字节?

C# 如何在FieldOffset=0的结构中创建数组字节?,c#,union,marshalling,C#,Union,Marshalling,例如,我用8个字节创建了byteArray,并将其绑定到字段UlongValue和DoubleValue [StructLayout(LayoutKind.Explicit, Pack = 1, Size = 8)] struct ULongStruct { [FieldOffset(0)] [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public byte[]

例如,我用8个字节创建了
byteArray
,并将其绑定到字段
UlongValue
DoubleValue

    [StructLayout(LayoutKind.Explicit, Pack = 1, Size = 8)]
    struct ULongStruct
    {
        [FieldOffset(0)]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        public byte[] byteArray;

        [FieldOffset(0)]
        public ulong UlongValue;

        [FieldOffset(0)]
        public double DoubleValue;
    }
不幸的是,我遇到了一个例外: 程序集原因它包含偏移量为0的对象字段,该字段与未显示对象的字段溢出的字段对齐不正确

作为解决方案,我可以创建

    [StructLayout(LayoutKind.Explicit, Pack = 1, Size = 8)]
    struct ULongStruct
    {
        //[FieldOffset(0)]
        //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
        //public byte[] byteArray;

        [FieldOffset(0)]
        byte byteArray0;

        [FieldOffset(1)]
        byte byteArray1;

        [FieldOffset(2)]
        byte byteArray2;

        [FieldOffset(3)]
        byte byteArray3;

        [FieldOffset(4)]
        byte byteArray4;

        [FieldOffset(5)]
        byte byteArray5;

        [FieldOffset(6)]
        byte byteArray6;

        [FieldOffset(7)]
        byte byteArray7;

        [FieldOffset(0)]
        public ulong UlongValue;
    }

但是为什么我不能对这个数组使用
[MarshalAs(UnmanagedType.ByValArray,SizeConst=8)]

尝试设置在属性中指定ArraySubType,比如:[MarshalAs(UnmanagedType.ByValArray,ArraySubType=UnmanagedType.U1,SizeConst=8)]我检查并得到相同的异常这是一个“联合”,数组引用也与托管代码中的ulong和double重叠。这是非法的,垃圾收集器无法知道联合是包含数组还是ulong或double。因此,它无法准确确定是否需要对数组进行垃圾收集。那很糟糕,非常非常糟糕。
fixed
缓冲区是最好的选择。请尝试设置在属性中指定ArraySubType,如:[Marshallas(UnmanagedType.ByValArray,ArraySubType=UnmanagedType.U1,SizeConst=8)]我检查并得到相同的例外情况这是一个“并集”,数组引用在托管代码中与ulong和double重叠。这是非法的,垃圾收集器无法知道联合是包含数组还是ulong或double。因此,它无法准确确定是否需要对数组进行垃圾收集。那很糟糕,非常非常糟糕。
固定的
缓冲区是最好的选择。