关于.net-core:因为它在-4-偏移位置处包含一个对象字段该字段已由一个非对象字段不正确地对齐或重叠

54次阅读

共计 1090 个字符,预计需要花费 3 分钟才能阅读完成。

TypeLoadException: 未能从程序集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加载类型“ECS.GUI.Define.ArmgAimPos”,因为它在 4 偏移地位处蕴含一个对象字段,该字段已由一个非对象字段不正确地对齐或重叠

异样呈现的关键字是:在 4 偏移地位处蕴含一个对象字段
通过查找对象,该对象为共用体


    // StructLayout 使设计者能够管制类或构造的数据字段的物理布局  
    // Explicit 与 FieldOffset 一起能够管制每个数据成员的准确地位 
    [StructLayout(LayoutKind.Explicit)]
    public struct ArmgAimPos
    {[FieldOffset(0)] public BayType type;
        [FieldOffset(4)] public string ContainerID;
        [FieldOffset(8)] public string JobID; 

应用 FieldOffset 属性实现共用体与强制类型转换

应用字段开始的构造中的偏移量初始化 FieldOffsetAttribute 类的新实例。

c# 
public FieldOffsetAttribute (int offset);

参数

offset Int32

从构造开始处到字段开始处的偏移量(以字节为单位)。

可示意的概念为:原理实际上跟 C ++ 一样,将一个 int[] 型的变量指向与 byte[]型变量雷同的内存区域,跟 C ++ 中将 dat 指向 char 数组的首地址是一样的。同样,这样的构造体性能与 C ++ 的共用体是一样的,即一个构造能够作为多种数据类型,而具体是什么类型视状况而定。

批改异样办法:

如提醒题目所示:4 偏移地位,曾经有一个非对象字段了,所以,将偏移量向后挪动即可解决

    // StructLayout 使设计者能够管制类或构造的数据字段的物理布局  
    // Explicit 与 FieldOffset 一起能够管制每个数据成员的准确地位 
    [StructLayout(LayoutKind.Explicit)]
    public struct ArmgAimPos
    {[FieldOffset(0)] public BayType type;
        [FieldOffset(8)] public string ContainerID; 
        [FieldOffset(16)] public string JobID; 

[FieldOffset(<font color=red> 8</font>)] public string ContainerID;
偏移量批改成了 8 , 问题修复

正文完
 0