CF Marshaler不太擅长这种类型的东西,而您尝试的东西不受支持。问题是它知道第一个元素是未对齐的,但它似乎不明白,数组中的每个元素也是未对齐的。
您可以看到的行为在这个例子中的工作原理:
[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;
}
@Reed - 谢谢,我现在改成了一个USHORT和我仍然得到错误,是4字节的ush?我看过msdn和sizeof(ushort)是2,但我得到错误。当我将fieldoffset更改为4时,它可以正常工作。 – SwDevMan81 2009-07-27 19:33:37
我的猜测现在是它的一个对齐问题,我需要在4字节边界上启动数组吗?我无法在网上找到任何东西 – SwDevMan81 2009-07-27 19:36:56