在.NET Framework框架中,程序集是重用、安全性以及版本控制的最小單元。程序集的定義為:程序集是一個或多個類型定義文件及資源文件的集合。程序集主要包含:PE/COFF,CLR頭,元數(shù)據(jù),清單,CIL代碼,元數(shù)據(jù)。

   PE/COFF文件是由工具生成的,表示文件的邏輯分組。PE文件包含“清單”數(shù)據(jù)塊,清單是由元數(shù)據(jù)表構(gòu)成的另一種集合,這些表描述了構(gòu)成程序集的文件,由程序集中的文件實現(xiàn)的公開導(dǎo)出的類型,以及與程序集關(guān)聯(lián)在一起的資源或數(shù)據(jù)文件。

   在托管程序集中包含元數(shù)據(jù)和IL(微軟的一種中間語言),IL能夠訪問和操作對象類型,并提供了指令來創(chuàng)建和初始化對象、調(diào)用對象上的虛方法以及直接操作數(shù)組元素。

   CLR頭是一個小的信息塊,主要包含模塊在生成是所面向的CLR的major(主)和major(次)版本號;一個標(biāo)志,一個MethodDef token(指定了模塊的入口方法);一個可選的強名稱數(shù)字簽名。

   元數(shù)據(jù)表示一個二進制數(shù)據(jù)塊,由幾個表構(gòu)成:定義表,引用表,清單表。

   以上是對程序集的構(gòu)成做了一個簡單的說明,接下來看一下程序集的一些特性:程序集定義了可重用的類型;程序集標(biāo)記了一個版本號;程序集可以有關(guān)聯(lián)的安全信息。

  在程序運行時,JIT編譯器利用程序集的TypeRef和AssemblyRef元數(shù)據(jù)表來確定哪一個程序集定義了所引用的類型。JIT編譯器在運行時需要獲取程序集的相關(guān)信息,主要包括:名稱、版本、語言文化、公鑰標(biāo)記等,并將這些連接為一個字符串。JIT編譯器會差查找該標(biāo)識的程序集,如果查詢到,則將該程序集加載到AppDomain。

   接下來介紹一下在CLR中加載程序集的方法:

    在System.Refection.Assembly類的靜態(tài)方法Load來加載程序集,在加載指定程序集的操作中,會使用LoadFrom()方法,LoadFrom()具有多個重載版本,看一下LoadFrom這個方法的底層實現(xiàn)代碼: