轉自:http://www.cnblogs.com/damonlan/p/3221347.htmlhtml
說到程序集,我剛開始對這個名詞特別的鬱悶!~。而後 前些天花了些時間 好好讀了一下,如今比較清晰了,把一些書上看到的 記下來,以饗讀者。但願沒浪費大家的時間。windows
程序集,說白了就是一個 *.dll 或者 *.exe爲後綴的文件。固然,如樓下朋友所說,是基於.NET平臺的!~。謝謝。工具
程序集,包括如下部分:測試
Windows文件首部(知道有這麼一個東西就行):就是告訴windows操做系統,本應用程序是ASP.NET 仍是Winform仍是控制檯應用程序。那怎麼查文件首部信息呢?spa
打開VS的命令行工具 而後輸入操作系統
dumpbin/headers 項目名稱.net
程序集分爲2類,私有程序集和共享程序集。命令行
CLR 首部信息:運行於.NET 的程序都是須要這個標誌哦!~若是須要查看它,也很簡單,code
打開VS的命令行工具 而後輸入orm
dumpbin/clrheaders 項目名稱
元數據:元素就是.NET 編譯後的語言,咱們能夠打開ILDASM.exe 工具進行查看,而後再按Ctrl +M 打開元數據查看:
程序集清單:就是記錄這個程序包含了哪些dll程序以及這個版本是啥等等。。。
咱們大多數的狀況用的都是單文件程序集哦!。這個特別好理解,好比咱們新建一個類庫工程,而後進行編譯,通常來講,編譯以後咱們會獲得一個 *.dll的文件,ok,這個就是單文件程序集啦!~
好,咱們來講說多文件程序集。咱們得知道,程序集由什麼構成?是模塊。因此,多文件程序集就是有多個模塊構成的程序集。很遺憾的是,若是咱們須要構建多文件程序集,VS IDE 是無法作的,只能經過命令行的csc.exe 命令進行。真辛苦~~~。
(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的文件。。咱們能夠把這個文件引入到程序中進行測試。Ok,咱們一個多文件程序集就這樣程序。可是,我感受這樣的用處不大。
Japan j = new Japan(); j.DisplayJapanese(); Console.ReadKey();
能彈出「I'm Japanese」,說明咱們引用成功了。
程序集分爲私有程序集和共享程序集
(1)啥是私有程序集。顧名思義,私 就是 私有的意思。就是咱們新建的項目庫中保留的dll 都是私有程序集。好比,在我其中一個MyTestConsle的項目,在Bin/Debug裏面都是私有程序集。
(2)配置私有程序集(probing 屬性)
通常狀況下,咱們須要dll,直接copy過去,是的,這樣很方便。可是,有的時候,咱們須要把dll放到不一樣的文件中,那麼這個時候,就須要進行配置。別擔憂,特別的簡單哦。
好比,咱們在C盤下面新建一個 MyTest的文件夾。我把剛的2個程序拷到這裏來,而且點擊MyTestProject.exe,Ok,能夠運行 這樣沒問題。。
可是,若是我新建一個「MyAllLibraries」文件夾,把個人Lanny.dll 文件放進去,以下圖,那我運行,咱們都知道 確定會報錯
咋辦呢?這個時候就須要咱們去配置了。咱們在MyTestProject.exe同級下新建一個「MyTestProject.exe.config」文件。入下圖:
MyTestProject.exe.config的內容是:
<?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 進行配置
咱們能新建Application Configuration File,而後進行配置。這個時候,它會自動把更新的內容更新到相應的 程序名.exe.config中。。
上一節中,咱們梳理了下私有程序集,如今咱們說下共享程序集。那麼它們之間最大的區別是什麼呢?它們的本質區別是共享程序集的一個副本可供一臺機器上的多個應用程序使用。
好比,我如今新建一個 Windows Forms的程序,裏面有一個「MessageBox.Show()」方法,但是很遺憾,你無法再你新建立的應用程序下面找到:System.Windows.Forms.dll的引用,爲啥?由於它是共享的程序集。不信 你看下圖,我沒騙你把。
那麼共享文件部署到哪裏呢?它安裝在GAC(Globle Assemble Cache)中,這個GAC 在下面的目錄中。
部署到GAC以前,必定要給這個程序集賦一個強命名,它就像是.NET中的GUID,是一個惟一標識符。它的做用是用於標識給定.NET二進制文件的發行者。
強命名的組成包括:
那怎麼生成強命名呢?有2種方法,一種是命令形式,另一個VS 圖形化,最後的時候附帶上。
①生成強命名文件
sn.exe 工具生成一個文件 以 *.snk(strong name key)後綴的文件。
語法是:
sn -k 文件名.snk
②把強命名文件放進程序中
咱們只須要把剛咱們myTestKey.snk 告訴編譯器就行了。那怎麼告訴呢?就是把信息寫進AssemblyInfo.cs 文件。
③安裝強命名的程序集
咱們須要使用gacutil.exe 工具。
安裝:gacutil.exe -i 程序集名稱
查看:gacutil.exe -l 程序集名稱
卸載:gacutil.exe -u 程序集名稱
如今咱們打開「C:\Windows\assembly」的時候,咱們並無找到剛MyLibrary.dll。原來在.NET 4中,GAC 被分在2個地方。.NET 1.0 到.NET 3.5的基礎類庫 就放到「C:\Windows\assembly」這裏。並且.NET 4 編譯下的程序集,是放到「C:\Windows\Microsoft.NET\assembly\GAC_MSIL\」中。。
那咱們就導入就行了!!。若是咱們導入了一個共享的GAC,這個時候 咱們無法再本地程序集下面找到這個程序集,只能在剛咱們所說的位置。
①打開properties
咱們選擇 <New ...>
②建立強命名文件
③顯示