非对象字段错误错误地对齐或重叠

时间:2009-07-27 19:20:59

标签: c# compact-framework alignment structure explicit

我正在尝试创建以下结构:

    [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的对象字段,该字段未正确对齐或由非对象字段重叠。

有谁知道为什么会导致错误?

注意:我不能使用Pack,因为我正在使用紧凑的框架。 感谢。

2 个答案:

答案 0 :(得分:11)

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;
}

答案 1 :(得分:2)

问题出现是因为您的数组与“X”重叠。在C#中,ulong是UInt64(在C ++中,ulong是UInt32),所以它实际上是8个字节。

如果您将第二个FieldOffset更改为8,或将X更改为uint,则会消失。