C# 如何在FieldOffset=0的结构中创建数组字节?
例如,我用8个字节创建了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[]
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。因此,它无法准确确定是否需要对数组进行垃圾收集。那很糟糕,非常非常糟糕。固定的
缓冲区是最好的选择。