字节数组“联合”覆盖在c#StructLayout.Explicit中

我希望在ac#struct类型中有一种c风格的uion。

出于某种原因,每次我分配一个我定义的类型时,我都会得到一个exception。 这是我自己的类型。 基本的想法是我可以访问这个结构的“指针”。 不幸的是我得到了一个Exception TypeLoadException:

附加信息:无法从程序集“ManagedTarget,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”加载类型“ManagedTarget.FngPeriodeParameterType”,因为它包含偏移0处的对象字段,该字段未正确对齐或重叠对象字段。

怎么了?

[StructLayout(LayoutKind.Explicit, Size = 16)] unsafe internal struct FngPeriodeParameterType { [FieldOffset(0)] public Byte[] ByteArray; [FieldOffset(0)] public UInt32 Repetitions; [FieldOffset(4)] public Int16 Amplitude; [FieldOffset(6)] public Int16 Offset; [FieldOffset(8)] public Int16 Gain; [FieldOffset(10)] public UInt16 Selection; [FieldOffset(12)] public UInt32 Step; } 

如果你的意图是ByteArray是原始数据,它必须是一个fixed缓冲区; 目前,它只是对堆上不相关的 byte[]的引用 – 并且您不能重叠引用和uint

 [FieldOffset(0)] public fixed byte ByteArray[16]; 

但是,使用它可能会很痛苦; 我通常添加辅助方法,如:

 public void ReadBytes(byte[] data) { fixed (byte* ptr = ByteArray) { for (int i = 0; i < 16; i++) data[i] = ptr[i]; } }