我要执行以下操作:

  [StructLayout(LayoutKind.Sequential, Pack = 1)]
  public struct SomeStruct
  {
     public byte  SomeByte;
     public int   SomeInt;
     public short SomeShort;
     public byte  SomeByte2;
  }

由于Compact框架不支持Pack,是否有其他选择?

更新:显式设置结构并为每个结构提供FieldOffset也不起作用,因为它不影响结构的打包方式

Update2:如果尝试以下操作,由于结构的打包方式,CF程序甚至无法运行:
[StructLayout(LayoutKind.Explicit, Size=8)]
public struct SomeStruct
{
   [FieldOffset(0)]
   public byte SomeByte;
   [FieldOffset(1)]
   public int SomeInt;
   [FieldOffset(5)]
   public short SomeShort;
   [FieldOffset(7)]
   public byte SomeByte2;
}

我知道这似乎难以置信,但是如果您尝试尝试,您将会看到。将其添加到CF项目并尝试运行它,您将获得TypeLoadException。分别将偏移量更改为0、4、8、10,它将起作用(但大小最终为12)。

我希望有人可以使用反射解决方案,也许可以分别编码(marshal)每个字段类型的大小(涉及递归以处理类型的结构或类型数组中的结构)。

最佳答案

这可能不是您要查找的答案类型,但是无论如何我都会将其发布出来:

public struct SomeStruct
{
    public byte SomeByte;
    public int SomeInt;
    public short SomeShort;
    public byte SomeByte2;


    public byte[] APIStruct
    {
        get
        {
            byte[] output = new byte[8];
            output[0] = this.SomeByte;
            Array.Copy(BitConverter.GetBytes(this.SomeInt), 0,
                output, 1, 4);
            Array.Copy(BitConverter.GetBytes(this.SomeShort), 0,
                output, 5, 2);
            output[7] = this.SomeByte2;
            return output;
        }
        set
        {
            byte[] input = value;
            this.SomeByte = input[0];
            this.SomeInt = BitConverter.ToInt32(input, 1);
            this.SomeShort = BitConverter.ToInt16(input, 5);
            this.SomeByte2 = input[7];
        }
    }
}

基本上,它会自行在APIStruct属性中进行打包。

关于c# - Compact Framework中是否有StructLayout “Pack”属性的替代方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1127601/

10-17 02:17