【问题标题】:Byte Array "Union" overlay in c# StructLayout.Explicitc#StructLayout.Explicit中的字节数组“联合”覆盖
【发布时间】:2013-07-29 08:52:36
【问题描述】:

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

由于某种原因,每次分配我定义的类型时都会出现异常。 这是我自己的类型。基本思想是我可以访问这个结构的“指针”。不幸的是,我得到了一个异常 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;
}

【问题讨论】:

    标签: c# memory-management


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      相关资源
      最近更新 更多