TypeLoadException: 未能從程序集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中加載類型“ECS.GUI.Define.ArmgAimPos”,因為它在 4 偏移位置處包含一個對象字段,該字段已由一個非對象字段不正確地對齊或重疊
異常出現(xiàn)的關(guān)鍵字是:在4偏移位置處包含一個對象字段
通過查找對象,該對象為共用體
// StructLayout使設(shè)計者可以控制類或結(jié)構(gòu)的數(shù)據(jù)字段的物理布局
// Explicit與FieldOffset一起可以控制每個數(shù)據(jù)成員的精確位置
[StructLayout(LayoutKind.Explicit)]
public struct ArmgAimPos
{
[FieldOffset(0)] public BayType type;
[FieldOffset(4)] public string ContainerID;
[FieldOffset(8)] public string JobID;
使用FieldOffset屬性實現(xiàn)共用體與強制類型轉(zhuǎn)換
使用字段開始的結(jié)構(gòu)中的偏移量初始化 FieldOffsetAttribute 類的新實例。
c#
public FieldOffsetAttribute (int offset);
參數(shù)
offset Int32
從結(jié)構(gòu)開始處到字段開始處的偏移量(以字節(jié)為單位)。
可表示的概念為:原理實際上跟C++一樣,將一個int[] 型的變量指向與byte[]型變量相同的內(nèi)存區(qū)域,跟C++中將dat指向char數(shù)組的首地址是一樣的。同樣,這樣的結(jié)構(gòu)體功能與C++的共用體是一樣的,即一個結(jié)構(gòu)可以作為多種數(shù)據(jù)類型,而具體是什么類型視情況而定。
修改異常方法:
如提示標(biāo)題所示:4偏移位置,已經(jīng)有一個非對象字段了,所以,將偏移量向后移動即可解決
// StructLayout使設(shè)計者可以控制類或結(jié)構(gòu)的數(shù)據(jù)字段的物理布局
// Explicit與FieldOffset一起可以控制每個數(shù)據(jù)成員的精確位置
[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 ,問題修復(fù)