認識程序集:1. 程序集的生成

程序集(Assembly)是.NET程序的最小組成單位。每個程序集都有自己的名稱、版本等信息。程序集通常表現爲一個文件(.exe或.dll文件),這樣的程序集被稱爲單文件程序集,這種程序集是最常見的。程序集也可以由多個文件組成,每個文件都是一個模塊文件或者是一個資源文件,這樣的程序集被稱爲多文件程序集。下面來了解一下如何生成單文件程序集和多文件程序集。

1. 單文件程序集的生成

這是最常見的程序集,使用 Visual Studio 只能生成單文件程序集。使用 csc.exe 能夠很輕鬆地生成單文件程序集:

csc.exe /target:library /resource:Hello.jpg Hello.cs

上述命令執行後,會生成一個名爲 Hello.dll 的文件,該文件組成了單文件程序集。這個文件是一個託管模塊,存儲了類型元數據和中間語言,還嵌入了資源文件 Hello.jpg 的內容(通過使用 /resource 選項)。類型元數據描述了模塊中定義的類型及其成員,中間語言是編譯後的託管代碼。

程序集本身其實是一個邏輯概念,對於自身的描述是通過程序集清單來實現的。程序集清單是一種元數據,描述了程序集的名稱、版本、區域性和強名稱信息,還包括組成程序集的文件的列表和資源信息,以及其他信息。在單文件程序集中,程序集清單的元數據直接保存在主模塊文件中。

在本例中,程序集中的名稱是Hello,版本沒有提供,默認爲0.0.0.0,區域性爲語言中立,強名稱信息爲空,文件列表只有Hello.exe,託管資源爲Hello.jpg。

2. 多文件程序集的生成

多文件程序集比較少見,而且除了使用 csc.exe 之外,有時還需要使用 AL.exe。假設有兩個源代碼文件 A.cs 和 B.cs,我們有兩種生成多文件程序集的方法,這兩種方法的主要區別在於程序集清單是存儲在某個模塊中還是單獨存儲於主模塊中。

先看第一種方法,只使用csc.exe就可以了:

csc.exe /target:module A.cs

csc.exe /target:library /addmodule.A.netmodule /out:Hello.dll B.cs

第一個命令將 A.cs 編譯爲一個模塊文件,A.netmodule,該文件僅包含類型元數據和中間語言,不包含程序集清單,是一種“原始”的模塊文件,不能獨立存在,必須從屬於程序集。第二個命令將 B.cs 編譯成模塊文件,Hello.dll。這個文件除了包含類型元數據和中間語言之外,還存儲了程序集清單,因爲成爲主模塊文件。此時,程序集的名稱仍然爲 Hello,但文件列表的內容變成了兩個:A.netmodule 和 Hello.dll。

再來看第二種方法,需要使用 csc.exe 和 al.exe 兩個命令:

csc /target:module A.cs

csc /target:module B.cs

al.exe /target:library /out:Hello.dll A.netmodule B.netmodule

前兩個命令將 A.cs 和 B.cs 編譯爲兩個“原始”的模塊文件,A.netmodule 和 B.netmodule。第三個命令使用了AL.exe(Assembly Linker,程序集鏈接器),該命令能夠將 A.netmodule 和 B.netmodule 組合到程序集中。這樣,最終會生成 Hello.dll 這個主模塊文件,該文件將僅包含程序集清單。在這個程序集清單中,文件列表的內容變成了三個:A.netmodule,B.netmodule 和 Hello.dll。

 

多文件程序集不僅生成麻煩,而且應用似乎也不是很廣泛,因爲對於CLR來說,它只認識程序集,所以部署的時候,都是以程序集作爲最小單位。一旦某個“原始”模塊發生了改變,整個程序集都必須重新生成。另外,只有程序集有版本,模塊作爲程序集的組成部分,不能被版本化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章