在介绍这个工具前,先介绍一下GAC(Gloabal Assembly Cache)全局程序集缓存。对于.NET3.5和以前的版本,GAC通常位于以下目录:C:\Windows\assembly,对于.NET4.0,GAC位于以下目录:C:\Windows\Microsoft.NET\assembly。
GAC到底是个啥呢?如果一个程序集要有多个应用程序访问,那么就必须把这个程序集放到一个已知的目录中,而且CLR在检测到对该程序集的一个引用时,必须知道自动检查该目录。这个已知的目录就叫做GAC。就比如我们经常使用的System.Windows.Forms.dll,System.Data.dll,很多程序都会用到,但是我们却在Bin目录没有找到它们,它们就在GAC里面,应用程序运行的时候,会自动到这个目录中去寻找。
在GAC中“注册”程序集的目录是什么?如果有两家公司分别分成了名称相同的dll,那么显然这两个dll就不能放在同一目录下,但是如果将程序集安装到GAC目录下,就会在GAC目录下创建专门的文件夹,它们会在不同的文件夹里面,就不会出现上面说的这种情况。
先来看看C:\Windows\assembly目录
里面都是我们没有见过的文件类型,只可以看到文件名,点击右键,我们可以卸载这个程序集,但怎么把一个程序放在这个目录下呢。很多人可以想直接放进行就行,确实可以直接拖进去,拖进去它就会把这个文件安装到这个目录下。但这不是建议的做法,建议的方法就是使用即将介绍的工具GACUtil.exe这个工具。因为GAC是目录化的,其中包含很多子目录,在这里看不出来。这些子目录的名称都是通过一个算法生成的,GACUtil.exe这个工具知道GAC的内部结构,并知道如何生成正确的子目录名。GACUtil.exe这个工具一般在C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin目录下。双击这个exe,它会显示一些东西,然后一闪而过,可以通过cmd打开这个工具,界面如下:
上面显示的是它的用法,我们可以通过开关/i和开关/u来分别添加和卸载程序集。注意不能将一个弱命名的程序集放到GAC中去,如果用这个工具安装一个弱命名程序集,它会报错。
如果我们想拷出GAC里面的dll,该怎么办?如果对.NET3.5以下的版本,GAC在这个目录下C:\Windows\Microsoft.NET\assembly,里面的结构我们看不到,也不能拷贝。可以有以下几个方法:
一是使用DOS命令,定位到这个目录下,它会自动显示这个目录下的所有子目录,然后通过命令进行拷贝。可以看到这个目录下面有很多文件夹。通过Copy命令去拷贝里面的dll。
第二种方法就是使用压缩软件,把这个目录放压缩软件的地址栏,按下“确定”就可以看到里面的目录结构,也可以看到里面的文件,直接右键复制文件即可。(这种方法我实验过不行,我在win7中32位中,输入的是.NET3.5框架的GAC目录,不知道是否在win7系统中做了改进)。这里面有一篇介绍的文章,里面还介绍了其他的方法,可以参考下拷出GAC里面的dll
上面的都是对于.NET3.5的GAC目录来操作的,对于.NET4.0,GAC位于以下目录:C:\Windows\Microsoft.NET\assembly。直接打开这个目录:
可以看到,里面直接把目录列出来了,打开里面的目录,出现了很多文件夹,里面可以找到我们经常使用的一些引用:
打开某个目录,可以直接右键复制相应的dll。
由此可知,对于.NET4.0的GAC目录,是可以直接查看文件里面的结构,并且复制里面的文件,而对于.NET3.5的GAC目录,则需要通过其他的方式查看里面的文件。不过不管哪一个版本的GAC目录,往里面添加dll以及卸载dll,最好都使用GACUtil这个工具。
另外微软MSDN上有对这个工具的详细介绍,具体可参考:GACUtil.exe(全局程序集缓存工具)
还有一些需要注意的就是(参考自《CLR via C#》):
1.只能把有强名称的程序集安装到GAC中,否则安装过程中会出错;
2.将程序集安装到GAC中,会破坏一个基本目标:简单地安装,备份,还原,移动和卸载应用程序,所以,建议程序员习题避免全局部署,尽量使用私有部署。