我试图创建以下结构:
[StructLayout(LayoutKind.Explicit, Size=14)]
public struct Message
{
[FieldOffset(0)]
public ushort X;
[FieldOffset(2)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]
private ushort[] Y;
[FieldOffset(12)]
public ushort Z;
}
我得到以下错误:
因为它包含的物场偏移量4,其被不正确地对准或由非对象场重叠未能从程序集加载类型“消息”。
有谁知道这是为什么造成错误?
注:因为我与紧凑的框架工作,我不能用包。 谢谢。
该CF封送也不是那么好,在这种类型的东西,什么你试图不受支持。 问题是,它知道的第一个元素是对齐的,但它似乎不明白,阵列中的每个元素也将是不对齐。
你可以看到在这个例子中的行为作品:
[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct Message
{
[FieldOffset(0)]
public ushort X;
[FieldOffset(2)]
private ushort Y1;
[MarshalAs(UnmanagedType.LPArray)]
[FieldOffset(4)]
private ushort[] Y2;
[FieldOffset(12)]
public ushort Z;
}
对于这种类型的结构,我从来没有让封送仍会尝试处理每个成员。 结构小,所以打出来这样的个别项目:
[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct Message
{
[FieldOffset(0)]
public ushort X;
[FieldOffset(2)]
private ushort Y1;
[FieldOffset(4)]
private ushort Y2;
[FieldOffset(6)]
private ushort Y3;
[FieldOffset(8)]
private ushort Y4;
[FieldOffset(10)]
private ushort Y5;
[FieldOffset(12)]
public ushort Z;
}
或者使用一个模拟的“联盟”是这样的:
public struct Y
{
public ushort a;
public ushort b;
public ushort c;
public ushort d;
public ushort e;
}
[StructLayout(LayoutKind.Explicit, Size = 14)]
public struct Message
{
[FieldOffset(0)]
public ushort X;
[FieldOffset(2)]
private Y Y;
[FieldOffset(12)]
public ushort Z;
}
问题发生,因为你的阵列重叠的“X”。 ulong,则在C#,是UINT64(在C ++中,ULONG是UInt32的),所以它实际上是8个字节。
如果你改变你的第二个FieldOffset到8,或者改变X为uint,会随风而逝。