20分鐘讀懂程序集
前言
說到程序集,我剛開始對這個名詞特別的郁悶!~。然后 前些天花了些時間 好好讀了一下,現(xiàn)在比較清晰了,把一些書上看到的 記下來,以饗讀者。希望沒浪費你們的時間。
一.程序集是什么
程序集,說白了就是一個 *.dll 或者 *.exe為后綴的文件。當(dāng)然,如樓下朋友所說,是基于.NET平臺的!~。謝謝。
程序集,包括以下部分:
- Windows 文件首部
- CLR 文件首部
- 元數(shù)據(jù)
- 程序集清單
- 可選的內(nèi)嵌資源
Windows文件首部(知道有這么一個東西就行):就是告訴windows操作系統(tǒng),本應(yīng)用程序是ASP.NET 還是Winform還是控制臺應(yīng)用程序。那怎么查文件首部信息呢?
打開VS的命令行工具 然后輸入
dumpbin/headers 項目名稱

程序集分為2類,私有程序集和共享程序集。
CLR 首部信息:運行于.NET 的程序都是需要這個標(biāo)志哦!~如果需要查看它,也很簡單,
打開VS的命令行工具 然后輸入
dumpbin/clrheaders 項目名稱
元數(shù)據(jù):元素就是.NET 編譯后的語言,我們可以打開ILDASM.exe 工具進(jìn)行查看,然后再按Ctrl +M 打開元數(shù)據(jù)查看:
程序集清單:就是記錄這個程序包含了哪些dll程序以及這個版本是啥等等。。。
二.單文件程序集和多文件程序集
2.1單文件程序集
我們大多數(shù)的情況用的都是單文件程序集哦!。這個特別好理解,比如我們新建一個類庫工程,然后進(jìn)行編譯,一般來說,編譯之后我們會得到一個 *.dll的文件,ok,這個就是單文件程序集啦!~
2.1多文件程序集
好,我們來說說多文件程序集。我們得知道,程序集由什么構(gòu)成?是模塊。所以,多文件程序集就是有多個模塊構(gòu)成的程序集。很遺憾的是,如果我們需要構(gòu)建多文件程序集,VS IDE 是沒法做的,只能通過命令行的csc.exe 命令進(jìn)行。真辛苦~~~。
(1)在記事本里 寫一段簡單的code,如下:
- using System;
- namespace Person
- {
- public class China
- {
- public void DisplayChinese()
- {
- Console.WriteLine("I'm Chinese");
- }
- }
- }
然后,打開你VS 命令行,把上面的生成一個模塊,命令如下:
csc.exe /t:module China.cs
我們能看到生成了一個:China.netmodule的模塊文件。
(2),接著我們在新建一個文件,并且這個文件生成是dll文件。
- using System;
- namespace Person
- {
- public class Japan
- {
- public void DisplayJapanese()
- {
- Console.WriteLine("I'm Japanese");
- }
- }
- }
(3)把剛China.netmodule模塊加入到剛需要生成的dll文件中。
命令是:
csc.exe /t:library /out:Lanny.dll Japan.cs /addmodule:China.netmodule
我們能看到生成了一個Lanny.dll的文件。。我們可以把這個文件引入到程序中進(jìn)行測試。Ok,我們一個多文件程序集就這樣程序。但是,我感覺這樣的用處不大。
- Japan j = new Japan();
- j.DisplayJapanese();
- Console.ReadKey();
能彈出“I'm Japanese”,說明我們引用成功了。
#p#
三。程序集的分類
程序集分為私有程序集和共享程序集
3.1私有程序集。
(1)啥是私有程序集。顧名思義,私 就是 私有的意思。就是我們新建的項目庫中保留的dll 都是私有程序集。比如,在我其中一個MyTestConsle的項目,在Bin/Debug里面都是私有程序集。
(2)配置私有程序集(probing 屬性)
一般情況下,我們需要dll,直接copy過去,是的,這樣很方便。但是,有的時候,我們需要把dll放到不同的文件中,那么這個時候,就需要進(jìn)行配置。別擔(dān)心,特別的簡單哦。
比如,我們在C盤下面新建一個 MyTest的文件夾。我把剛的2個程序拷到這里來,并且點擊MyTestProject.exe,Ok,可以運行 這樣沒問題。。
但是,如果我新建一個“MyAllLibraries”文件夾,把我的Lanny.dll 文件放進(jìn)去,如下圖,那我運行,我們都知道 肯定會報錯
咋辦呢?這個時候就需要我們?nèi)ヅ渲昧?。我們在MyTestProject.exe同級下新建一個“MyTestProject.exe.config”文件。入下圖:
MyTestProject.exe.config的內(nèi)容是:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <runtime>
- <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
- <probing privatePath="MyAllLibraries" />
- </assemblyBinding>
- </runtime>
- </configuration>
特別好理解,就是指明程序如果沒有找到這個dll文件,那么我去哪里尋找。。。這樣,我們就能順利運行了。不截圖了。
(3)使用VS IDE 進(jìn)行配置
我們能新建Application Configuration File,然后進(jìn)行配置。這個時候,它會自動把更新的內(nèi)容更新到相應(yīng)的 程序名.exe.config中。。
3.2共享程序集
(1)了解共享程序集
上一節(jié)中,我們梳理了下私有程序集,現(xiàn)在我們說下共享程序集。那么它們之間最大的區(qū)別是什么呢?它們的本質(zhì)區(qū)別是共享程序集的一個副本可供一臺機(jī)器上的多個應(yīng)用程序使用。
比如,我現(xiàn)在新建一個 Windows Forms的程序,里面有一個“MessageBox.Show()”方法,可是很遺憾,你沒法再你新創(chuàng)建的應(yīng)用程序下面找到:System.Windows.Forms.dll的引用,為啥?因為它是共享的程序集。不信 你看下圖,我沒騙你把。
那么共享文件部署到哪里呢?它安裝在GAC(Globle Assemble Cache)中,這個GAC 在下面的目錄中。
#p#
(2)部署GAC--強(qiáng)命名
部署到GAC之前,一定要給這個程序集賦一個強(qiáng)命名,它就像是.NET中的GUID,是一個唯一標(biāo)識符。它的作用是用于標(biāo)識給定.NET二進(jìn)制文件的發(fā)行者。
強(qiáng)命名的組成包括:
- 程序集的友好名稱
- 程序集的版本號
- 公鑰值
- 等等。。
那怎么生成強(qiáng)命名呢?有2種方法,一種是命令形式,另外一個VS 圖形化,最后的時候附帶上。
①生成強(qiáng)命名文件
sn.exe 工具生成一個文件 以 *.snk(strong name key)后綴的文件。
語法是:
sn -k 文件名.snk
②把強(qiáng)命名文件放進(jìn)程序中
我們只需要把剛我們myTestKey.snk 告訴編譯器就好了。那怎么告訴呢?就是把信息寫進(jìn)AssemblyInfo.cs 文件。
③安裝強(qiáng)命名的程序集
我們需要使用gacutil.exe 工具。
安裝:gacutil.exe -i 程序集名稱
查看:gacutil.exe -l 程序集名稱
卸載:gacutil.exe -u 程序集名稱
現(xiàn)在我們打開“C:\Windows\assembly”的時候,我們并沒有找到剛MyLibrary.dll。原來在.NET 4中,GAC 被分在2個地方。.NET 1.0 到.NET 3.5的基礎(chǔ)類庫 就放到“C:\Windows\assembly”這里。而且.NET 4 編譯下的程序集,是放到“C:\Windows\Microsoft.NET\assembly\GAC_MSIL\”中。。
3.3 使用共享GAC
那我們就導(dǎo)入就好了!!。如果我們導(dǎo)入了一個共享的GAC,這個時候 我們沒法再本地程序集下面找到這個程序集,只能在剛我們所說的位置。
3.4圖形化配置GAC
①打開properties
我們選擇 <New ...>
②創(chuàng)建強(qiáng)命名文件
③顯示