全局程序集緩存 (GAC)
計算機范圍內的代碼緩存,它存儲專門安裝的程序集,這些程序集由計算機上的許多應用程序共享。在全局程序集緩存中部署的應用程序必須具有強名稱
是的,gac中的所有的assembly都會存放在系統目錄"%winroot%\assembly下面。放在系統目錄下的好處之一是可以讓系統管理員通過用戶權限來控制assembly的訪問。
關於gac本身,上面所引述的一段話正是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)》