加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 非对象字段错误导致错误对齐或重叠

发布时间:2020-12-16 01:21:42 所属栏目:百科 来源:网络整理
导读:我正在尝试创建以下结构: [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
我正在尝试创建以下结构:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读