一、源代碼-面向CLR的編譯器-托管模塊-(元數據&IL代碼)中介紹了編譯器將源文件編譯成托管模塊(中間語言和元數據),本文主要介紹如何將托管模塊合並成程序集.
2、程序集生成的過程
注:
(1)、清單指出程序集只有一個文件組成
(2)、對於只有一個托管模塊,沒有資源文件的項目,程序集就是托管模塊.
(3)、如果需要將一組文件合並到程序集中可以使用程序集鏈接器(AL.exe)以及其他的一些命令行選項.
3、如何構建可重用、可版本控制、可保護的組件.
常用的方法是,把程序集的物理表示和邏輯表示區分開,將很少用到的類型和文件放到單獨的文件中,並將這些文件作為程序集的一部分,如果運行時需要,則去下載,這樣不僅節省了磁盤空間,還節省了安裝時間.通過程序集,可以在不同的地方部署,同時任然將所有的文件當作一個整體來看待.
4、關於程序集自描述的優點
在程序集的模塊中,還包含與引用的程序集有關的信息(版本號、描述等等),具體如下圖

這些信息(當然遠不止上圖中的這點信息)使程序集能夠自描述.也就是說CLR能判斷為了執行程序集中的代碼,程序集的直接依賴對象是什么.不需要在注冊表或者Active Directory Domain Services(ADDS)中注冊額外的信息.由於無需額外的信息,所以和非托管組件相比,程序集更容易部署.
5、將模塊合並成程序集
程序集構成簡介:
一、源代碼-面向CLR的編譯器-托管模塊-(元數據&IL代碼)中介紹了C#源碼通過編譯器最終生成托管模塊,而托管模塊是標准的32位Microsoft Windows可移植執行體(PE32)文件或者標准的64位Microsoft Windows可移植執行體(PE32+)文件。
而exe文件並不是只含有元數據的PE文件,它還是程序集.程序集是一個或多個類型定義文件及資源文件的集合,
程序集清單文件簡介:
在程序集的所有文件中二、源代碼=>程序集及程序集概念介紹,有一個文件容納了清單.清單也是一個元數據表集合(關於元數據表請參考十、元數據概述),表中主要包含作為程序集組成部分的那些文件的名稱,除此之外,還描述了程序集的版本、語言文化、發布者、公開導出的類型以及構成程序集的所有文件.
CLR操作的是程序集,CLR總是先加載"清單"中的數據,在根據"清單"中的數據來獲取程序集中其他文件的名稱.以下是程序集的重要特點
(1)、程序集定義了可重用的類型
(2)、程序集用一個版本號標記
(3)、程序集可以關聯安全信息
除了包含清單元數據表的文件,程序集其他的單獨文件並不具備上述特點.
類型為了進行順利的打包、版本控制、安全保護以及使用,必須放在作為程序集一部分的模塊中,程序集大多時候只有一個文件,就像前面的Program.exe文件那樣,然而,程序集還可由多個文件構成,一些文件是含有元數據的PE文件,另一些是.gif文件或.jpg這樣的文件,為了便於理解,可將程序集看作一個邏輯EXE或DLL.
6、Microsoft引入程序集的的原因
使用程序集將可重用類型的邏輯表示與物理表示區分開,例如,程序集可能包含多個類型,可以將常用類型放到一個文件中,不常用類型放到另一個文件中.如果程序集需要從Internet下載並部署,那么對於含有不常用類型的文件,假如客戶端永遠不使用那些類型,該文件就永遠不會下載到客戶端.
7、配置應用程序下載程序集文件
為了配置應用程序去下載程序集文件,可在應用程序配置文件中指定codeBase元素,在codeBase元素定義的URL所指向的位置,可找到程序集的所有文件.
應用程序下載程序集的過程如下:
(1)、CLR獲取codeBase元素的URL
(2)、檢查機器的下載緩存,判斷文件是否存在.如果是,直接加載文件.如果不是,CLR去URL指向的位置將文件下載到緩存.
(3)、如果找不到文件,CLR在運行時拋出FileNotFoundException異常.
8、使用多文件程序集的三點理由
(1)、不同的類型用不同的文件,是文件能以"增量"方式下載(如Internet下載方式).另外,將類型划分到不同的文件中,可以對購買和安裝的應用程序進行部分或分批打包/部署.
(2)、可在程序集中添加資源或數據文件.
例如,假定一個類型的作用是計算保險信息,需要訪問精算表才能完成計算,這種情況下,不必在自己的源代碼中嵌入精算表,相反,可以使用一個工具(比如稍后要討論的程序集鏈接器AL.exe),是數據文件成為程序集的一部分.順便說一句,數據文件可以為任意格式,只要應用程序知道如何解析即可.
(3)、程序集包含的各個類型可以用不同的編程語言來實現.例如,一些類型可以用C#實現,一些用VB來實現,其他則用其他語言來實現,編譯用C#寫的類型是,編譯器會生成一個一個模塊,編譯用VB寫的類型時,編譯器也會生成另一個模塊,然后使用工具將所有的模塊合並成一個程序集.
好處:這樣其他開發人員只知道這個程序集包含了一系列的類型信息,根本不知道、也不用知道這些類型分別是用什么語言編寫的.當然可以使用ILDasm.exe獲得相應的IL源代碼文件。然后運行ILAsm.exe.將所有的
9、將模塊還原成單個文件
(1)、對每個模塊都運行ILDasm.exe,獲得相應的IL源代碼文件.
(2)、運行ILAsm.exe,將所有的IL源代碼文件傳給它.隨后,ILAsm.exe會生成包含類型的單個文件.
前提:生成的IL代碼足夠干凈.
10、關於程序集必知的重點
(1)、程序集是進行重用、版本控制和應用安全性設置的基本單元。它允許將類型
轉載自https://blog.csdn.net/weixin_33811961/article/details/86128955