在.NET 中,新引入了一個程序集的概念,就是指經由編譯器編譯得到的,供CLR進一步編譯執行的那個中間產物,在WINDOWS系統中,它一般表現為.dll,或者是.exe的格式,但是要注意,它們跟普通意義上的WIN32可執行程序是完全不同的東西,程序集必須依靠CLR才能順利執行。
之所以要編譯為程序集然后由.NET FRAMEWORK解析執行,就是為了實現跨平台的功能。並且由CLR解析執行可以針對不同的具體平台生成具體針對性的優化代碼,對執行效率也有好處。
程序集的格式如下:
WIN32文件頭
CLR文件頭
CIL代碼
類型無數據(metadata)
程序集清單(manifest)
可選的嵌入資源
既然這兒都包含WIN32文件頭了,跨平台又從何跨起呢?肯定不是這么簡單,要是想在別的平台上,應該還是需要重新編譯。
因為任何一個模塊,要想讓WINDOWS執行,必須先跟WINDOWS打招呼,然后由WINDOWS再調用CLR來解析執行你的模塊,而不會由CLR直接監聽到你的雙擊事件而啟動解析。關於WIN32文件頭,在VISUAL STUDIO 2008中,打開 Command Prompt 工具,然后在其中調用這個程序 : dumpbin 然后給其參數:
dumpbin test1.exe /headers (這個工具也可以使用在普通WIN32可執行程序上。)
這樣子就可以看到某一程序集的WIN32文件頭信息。看一下頭三行是這樣子的:
Dump of file test1.exe
PE signature found
File Type: EXECUTABLE IMAGE (剛看到時我發現這個 EXECUTABLE IMAGE,是不是普通的可執行程序不是IMAGE呢?打開一個普通的看了一下,發現也是。。)
dumpbin 工具還可以用 /clrheader 參數查看一個.NET程序集的 CLR 頭信息。
接下來是CIL代碼部分,這就是一個程序集的最核心部分了。CIL的細節日后再具體學習吧。
元數據部分完整地描述了程序集內含類型和引用外部類型的格式。.NET CLR利用元數據在內存的二進制布局類型中類型(以及類型成員)的位置,使遠程方法調用更便利。元數據是反射得以實現的重要條件。
MANIFEST里面詳細記錄了程序集中的每一個模塊,其版本,以及引用的外部程序集。
查看CIL , METADATA, MANIFEST 需要借助於 ildasm.exe 或者 reflector.exe 工具。
在大多數情況下,一個程序集由一個獨立的模塊組成。但是,有時候程序集大了后,為了降低耦合度,可以把它分解為多文件程序集。由多個 .dll 文件來組成它。其中會有一個 .dll 做為主模塊。然后主模塊的清單記錄了它依賴的每一個 .dll 文件。並且,這些不同模塊可以由不同的語言寫成。
在VS2008中,選擇新建項目中的 Class Library 就可以自動生成 .dll 類庫文件。這時候,程序中沒有Main()方法,你只能BUILD它,但不能運行它。
如果你要在某個項目中使用它,那么你需要添加到該二進制文件的reference 引用,然后using 它的命名空間,這樣子。。。
私有程序集 與 共享程序集
私有程序集就是不同項目中生成的程序集,僅供本項目使用,或者可以經過配置被某一個其它項目的程序集引用。
共享程序集是機器級別的共享程序集,它放置一個叫GAC (Global Assembly Cache)的地方,可以被其它所有的私有程序集所引用。注意,GAC中只能放置.dll文件,而不能有.exe 文件。關於如何部署到GAC,具體細節查書。關於程序集的部署配置有很多需要注意的地方。日后再說。