全局程序集缓存 (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)》
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和不使用GAC的区别:
一、使用强签名
1、所有的DLL必须使用强签名;
2、需要对生成的DLL进行版本管理;
3、对使用的snk文件在项目组内进行管理;
4、在程序部署时,将程序使用的DLL放到“C:/WINDOWS/assembly/”目录中(就是系统目录的assembly目录中),应用程序就可以运行了;
5、当有不同版本,或不同签名的DLL时,应用程序会通过"MSCoree.dll"找到其合适的版本的dll;
6、这种方式的好处就是把问题全部集中管理,免去多个应用程序使用不同版本问题;
7、担心的问题就是要围绕snk文件建立完整的项目管理体系,什么时候升级版本,什么时候升级snk;
8、还有,就是强签名的程序集使用的程序集也必须是有强签名的;
二、不使用强签名
1、如果不使用强签名,在我们的系统中,对DLL的管理就是跟着应用程序走,每个应用程序在FTP上是一个目录;
2、在本地,也是每个应用程序一个目录,应用程序要用到的所有dll都存放在该目录下,该目录下的文件和FTP对应的目录保持一致;
3、这样做似乎也不是很理想,一个基础的dll要升级,所有应用程序目录下的这个dll都要升级?麻烦!
不知道有没有第三种做法了,目的就是让一个很复杂的系统能够很容易的升级。
以上就是需求了!
另外,gac的方法是提供应用程序发布使用的,开发的IDE依然需要手动添加引用的组件。gac只是表名这个组件是全局的。
转自:http://hi.baidu.com/654085966/blog/item/b0e0fc53c6fe72858c543023.html