GAC中的所有的Assembly都會存放在系統目錄"%winroot%\assembly下面。放在系統目錄下的好處之一是可以讓系統管理者通過使用者權限來控制Assembly的通路。
關于GAC本身,上面redcaff_l所引述的一段話正是MSDN中對GAC的定義。GAC全稱是Global Assembly Cache,他的作用是可以存放一些有很多程式都要用到的公共Assembly,例如System.Data、System.Windows.Forms等等。這樣,很多程式就可以從GAC裡面取得Assembly,而不需要再把所有要用到的Assembly都拷貝到應用程式的執行目錄下面。舉例而言,如果沒有GAC,那麼勢必每個WinForm程式的目錄下就都要從C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705下面拷貝一份System.Windows.Forms.dll,這樣顯然不如都從GAC裡面取用友善,也有利于Assembly的更新和版本控制。
除了系統預設放置在GAC中的Assembly如System.Windows.Forms以外,我們也可以添加自己的Assembly:
1)建立一個strong-name的Assembly,例如ToolbarComponent.dll
2)運作gacutil -i ToolbarComponent.dll,把這個Assembly添加到GAC
3)在程式中動态裝載:
System.Reflection.Assembly ass=Assembly.Load("ToolbarComponent, Version=1.0.934.20434, Culture=neutral, PublicKeyToken=65f45658c8d4927f");
MessageBox.Show("Is the assembly loaded from GAC? "+ass.GlobalAssemblyCache);
在上面的程式中,ToolbarComponent就是從GAC裝載而不是從程式的運作目錄下的dll檔案中裝載,程式目錄下不需要放置ToolbarComponent.dll程式也能正常運作。另外,Assembly.Load()中的參數可以通過"gacutil -l"查到。
另外,上面提到了GAC中的Assembly必須是strong-name的。建立strong-name的Assembly的步驟大緻如下:
a) 在指令行運作“sn -k keyPair.snk”建立一個密鑰檔案。這裡的sn.exe也是.NET附帶的一個工具。
b) 在VS.NET裡面修改“AssemblyInfo.cs”檔案:
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\keyPair.snk")]
c) 編譯項目,就能得到一個strong-name的Assembly。
MSDN中有一些對GAC的介紹,您可以參考:
1)《Assembly Cache Viewer (Shfusion.dll)》
2)《Global Assembly Cache》
.NET Framework中附帶了一些和GAC有關的工具,其中包括:
1)Gacutil.exe,一個指令行的工具,用于在GAC中浏覽、添加、删除Assembly
2)Ngen.exe,也是一個指令行的工具,用于在GAC中建立Native Image
3)mscorcfg.msc,一個MMC終端,可以圖形化完成Gacutil.exe的主要功能。
希望以上一些介紹能夠對您有幫助。
Hogwarts - S(u)ddenly dis@ppeared...
-
本貼子以“現狀”提供且沒有任何擔保,同時也沒有授予任何權利。具體事項可參見使用條款(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
-------------
總結:以前沒注意,原來.net sdk還提供了不少小工具呢,想gacutil,Ngen,sn什麼的,都是dos的,另外,這些小程式,copy到任意地方均可以運作!不錯啊。
本文轉自Jack Niu部落格園部落格,原文連結:http://www.cnblogs.com/skywind/archive/2007/03/28/691284.html,如需轉載請自行聯系原作者