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