在.NET Framework框架中,程序集是重用、安全性以及版本控制的最小單元。程序集的定義為:程序集是一個(gè)或多個(gè)類型定義文件及資源文件的集合。程序集主要包含:PE/COFF,CLR頭,元數(shù)據(jù),清單,CIL代碼,元數(shù)據(jù)。
PE/COFF文件是由工具生成的,表示文件的邏輯分組。PE文件包含“清單”數(shù)據(jù)塊,清單是由元數(shù)據(jù)表構(gòu)成的另一種集合,這些表描述了構(gòu)成程序集的文件,由程序集中的文件實(shí)現(xiàn)的公開導(dǎo)出的類型,以及與程序集關(guān)聯(lián)在一起的資源或數(shù)據(jù)文件。
在托管程序集中包含元數(shù)據(jù)和IL(微軟的一種中間語言),IL能夠訪問和操作對(duì)象類型,并提供了指令來創(chuàng)建和初始化對(duì)象、調(diào)用對(duì)象上的虛方法以及直接操作數(shù)組元素。
CLR頭是一個(gè)小的信息塊,主要包含模塊在生成是所面向的CLR的major(主)和major(次)版本號(hào);一個(gè)標(biāo)志,一個(gè)MethodDef token(指定了模塊的入口方法);一個(gè)可選的強(qiáng)名稱數(shù)字簽名。
元數(shù)據(jù)表示一個(gè)二進(jìn)制數(shù)據(jù)塊,由幾個(gè)表構(gòu)成:定義表,引用表,清單表。
以上是對(duì)程序集的構(gòu)成做了一個(gè)簡(jiǎn)單的說明,接下來看一下程序集的一些特性:程序集定義了可重用的類型;程序集標(biāo)記了一個(gè)版本號(hào);程序集可以有關(guān)聯(lián)的安全信息。
在程序運(yùn)行時(shí),JIT編譯器利用程序集的TypeRef和AssemblyRef元數(shù)據(jù)表來確定哪一個(gè)程序集定義了所引用的類型。JIT編譯器在運(yùn)行時(shí)需要獲取程序集的相關(guān)信息,主要包括:名稱、版本、語言文化、公鑰標(biāo)記等,并將這些連接為一個(gè)字符串。JIT編譯器會(huì)差查找該標(biāo)識(shí)的程序集,如果查詢到,則將該程序集加載到AppDomain。
接下來介紹一下在CLR中加載程序集的方法:
在System.Refection.Assembly類的靜態(tài)方法Load來加載程序集,在加載指定程序集的操作中,會(huì)使用LoadFrom()方法,LoadFrom()具有多個(gè)重載版本,看一下LoadFrom這個(gè)方法的底層實(shí)現(xiàn)代碼:
[ResourceExposure(ResourceScope.Machine)]
[ResourceConsumption(ResourceScope.Machine)]
[MethodImplAttribute(MethodImplOptions.NoInlin