我要执行以下操作:
[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/