是的,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的主要功能。
“全局程序集緩存GAC”是什麼概念?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.