由于非对象字段错误而导致错误对齐或重叠

2023-12-02

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

    [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,因为我正在使用紧凑框架。 谢谢。


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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于非对象字段错误而导致错误对齐或重叠 的相关文章

随机推荐