字节数组“联合”覆盖在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]; } }