正确对齐或通过非对象场重叠误差(Incorrectly aligned or overlapped

2019-06-17 16:43发布

我试图创建以下结构:

    [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,其被不正确地对准或由非对象场重叠未能从程序集加载类型“消息”。

有谁知道这是为什么造成错误?

注:因为我与紧凑的框架工作,我不能用包。 谢谢。

Answer 1:

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


Answer 2:

问题发生,因为你的阵列重叠的“X”。 ulong,则在C#,是UINT64(在C ++中,ULONG是UInt32的),所以它实际上是8个字节。

如果你改变你的第二个FieldOffset到8,或者改变X为uint,会随风而逝。



文章来源: Incorrectly aligned or overlapped by a non-object field error