TypeLoadException: 未能從程式集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中載入型別“ECS.GUI.Define.ArmgAimPos”,因為它在 4 偏移位置處包含一個物件欄位,該欄位已由一個非物件欄位不正確地對齊或重疊
阿新 • • 發佈:2021-01-11
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( 8)] public string ContainerID;
偏移量修改成了8 ,問題修復