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 , 问题修复