1. 程式人生 > 實用技巧 >TypeLoadException: 未能從程式集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中載入型別“ECS.GUI.Define.ArmgAimPos”,因為它在 4 偏移位置處包含一個物件欄位,該欄位已由一個非物件欄位不正確地對齊或重疊

TypeLoadException: 未能從程式集“ECS.GUI.Define, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”中載入型別“ECS.GUI.Define.ArmgAimPos”,因為它在 4 偏移位置處包含一個物件欄位,該欄位已由一個非物件欄位不正確地對齊或重疊

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 ,問題修復