全局程序集緩存GAC

全局程序集緩存(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。

.NET   Framework中附帶了一些和GAC有關的工具,其中包括:

1)Gacutil.exe,一個命令行的工具,用於在GAC中瀏覽、添加、刪除Assembly。

2)Ngen.exe,也是一個命令行的工具,用於在GAC中創建Native   Image。

3)mscorcfg.msc,一個MMC終端,可以圖形化完成Gacutil.exe的主要功能。

 

從命令行查看GAC,可以看到內部有很多目錄結構,GAC_32主要存放x86的一些代碼緩存,GAC_64主要存放x64的一些相關dll。

MSDN中有一些對GAC的介紹,可以參考:

1)《Assembly   Cache   Viewer   (Shfusion.dll)》

2)《Global   Assembly   Cache》

轉載於:https://www.cnblogs.com/lly001001/archive/2012/05/24/2515583.html