GAC全局程序集缓存相关知识



一 将dll部署到全局程序集缓存(GAC)中

全局程序集缓存(GAC)(位置 C:\WINDOWS\assembly)(win7 .net 4.0下 C:\Windows\Microsoft.NET\assembly\)。

针对一些类库项目或用户控件项目(一般来说,这类项目最后编译生成的是一个或多个dll文件),在程序开发完成后,有时需要将开发的程序集(dll文件)安装部署到GAC(全局程序集缓存)中,以便其他的程序也可以调用。
   

  一般来说,将程序集(dll)安装到GAC中有以下几种方法:

1.   手动将要安装部署的dll文件拖至系统目录windows下的assembly文件夹下(一般为C:/windows/assembly),此种方法不便于在安装部署时使用。
2.   使用gacutil.exe工具安装:gacutil -i "要注册的dll文件全路径"。

     "gacutil.exe”工具为.NET自带工具 (C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin)
      注win7下由于权限问题,要以管理员身份启动这个命令才行;

在开始运行中输入"cmd”进入命令窗口,通过CD选择到"gacutil.exe”文件所在的目录,

或者 使用Visual Studio 命令提示符

如在命令行输入: gacutil -i D:/Microsoft.SharePoint.dll

可以输入‘gacutil -?’查看帮助

但是,注意:不能将一个弱命名程序集安装到GAC中。在进行上述2-3种方法安装过程之前,我们必须保证此项目具有强名称才可以。
    给项目添加强名称需要以下三步:
1. 在项目调试完成后,使用sn.exe工具生成一个密钥。sn -k "生成的密钥的全路径"。
    如在命令行输入: sn -k D:/myKey.snk
2. 将密钥与项目的程序集进行关联: 项目属性-->签名-->为程序集签名-->选择强名称密钥文件。
    此外, 还有另外一种方法,就是在项目的AssemblyInfo.cs文件中,修改"AssemblyKeyFile"的属性。
    如: [assembly:AssemblyKeyFile("D://myKey.snk")] 这个方法在vs2010中不行,会报错,推荐用第一种
3. 重新生成项目集,再用gacutil -i 安装

将程序集从GAC中移出(称为“卸载”)的方法也有两种:

1:打开GAC文件夹,选中要卸载的程序集,然后在右键菜单中选择“卸载”

2:使用DOS命令:gacutil /u myControls

注:/u表示卸载,后面的参数表示的是程序集的名称,不能写上.dll



二 如何引用全局程序集缓存中的dll

把程序集安装到GAC,但开发时VS并不会加载GAC,所以你没有办法去添加引用。
这与VS自带的程序集是一样的,只有运行时才使用GAC,开发时使用的程序集是则是GAC的一个副本,在.net目录下,通常是"D:\WINDOWS\Microsoft.NET\Framework\版本号\"。

对你而言解决的办法有三种:
1. 把要放到GAC的程序集复制一份,放在“D:\WINDOWS\Microsoft.NET\Framework\版本号\”下。VS会自动加载这个目录的程序集,所以可以在项目中引用。(win7 vs2010下这个方法试过,不行,不知道是啥问题)
2. 把要放到GAC的程序集复制一份,放在项目文件夹下,添加文件引用. (可行)
3. 如果你有这个GAC程序集的项目源代码,可以直接在解决方案中添加这个项目,然后在其他项目中添加项目引用。(可行)

注意:如果引用的dll已在GAC中,生成项目时bin下面不再有这个文件,通常引用的dll在生成是会复制一份到bin下面