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

时间:2013-07-29 14:05:30

标签: c# memory-management

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

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

其他信息:无法加载类型' ManagedTarget.FngPeriodeParameterType'来自assembly' ManagedTarget,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'因为它包含偏移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;
}

1 个答案:

答案 0 :(得分:5)

如果你的意图是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];
    }
}