NETT

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

首先要说一下GAC,相信大家并不陌生,它全称是Global Assembly Cache,在我看来就是存放公用Assembly的一个文件夹,它的物理位置是%SystemRoot%\assembly,只要装了.NET Framwork这个文件夹就会存在,在里面你可以看到这里面的Assembly有Vesion,Public key,culture及Processor Architecture等信息,如下图:

                         1.1 %SystemRoot%\assembly

一.关于GAC的几点
1.放在这里面的Assembly是可以同名的,前题是要保证他们的版本不同(在下面第三点中解释了为什么可以重名)
2.Assembly 必须是强签名的(Strongly named)
3.其实在%SystemRoot%\assembly文件夹下并不是我们看到的那样,它里面还有几个子文件夹GAC,GAC_32,GAC_MSIL等,assembly是放在这些文件夹中的,在CMD下Dir 一下

 Directory of f:\Windows\assembly
2010/04/15  13:13    <DIR>          GAC
2010/03/08  05:23    <DIR>          GAC_32
2010/04/19  11:54    <DIR>          GAC_MSIL
2010/03/08  12:05    <DIR>          NativeImages_v2.0.50727_32
2010/03/08  12:05    <DIR>          NativeImages_v4.0.30128_32
2010/03/08  12:05    <DIR>          temp
2010/04/19  11:54    <DIR>          tmp
我们可以用Tree -f 查看实际存储的结构,下面是GAC_MSIL下的文件存储结构片断
│         
├─microsoft.datawarehouse.interfaces.resources
│  └─9.0.242.0_zh-CHS_89845dcd8080cc91 =======>Verison_Culture_PublicKeytoken形式的子文件夹
│          Microsoft.DataWarehouse.Interfaces.resources.dll
│         
├─Microsoft.ExceptionMessageBox                ========>以Assembly 的名字命名的文件夹
│  ├─10.0.0.0__89845dcd8080cc91             =======>这里中间是__是因为此DLL没有culture信息
│  │      Microsoft.ExceptionMessageBox.dll    ====>这个是实际的DLL                
│  │     
│  └─9.0.242.0__89845dcd8080cc91           ========>另外一个Version
│          Microsoft.ExceptionMessageBox.dll

如上所示,大家很容易就知道为什么GAC中可以有同名的Assembly了.

二.如何把你的Assembly加到GAC中
  第一步,给Assembly强命名
  方法1:
  在项目属性中,转到Signing这一项,勾上Sign the assembly Checkbox,重新build一下. 
  方法2:
  首先用sn.exe 创建一个snk文件,sn.exe -k c:\mysn.snk .
  在项目属性中,转到Signing这一项,勾上Sign the assembly Checkbox,浏览到你上面所创建的snk,重新build一下.

 
  方法3:
  在项目的Assemblyinfo.cs文件中,加入[assembly:AssemblyKeyFile(@"mysn.snk")],小括号中是你上面创建的snk文件的路径,我的是和项目文件同一个目录下.

  如果要查看assembly是不是强命名的,可以用sn -v [myassembly],如果不是强签名的,信息是[myassembly] does not represent a strongly named assembly,如果是强签名的,信息是[myassembly] is valid.
第二步,把它加到GAC吧
    用gacutil.exe -i [myassembly],如果你看到Assembly successfully added to the cache,恭喜你成功了:)

从GAC中卸载DLL可以直接到%SystemRoot%\assembly 下找到你想卸载的DLL,然后点右键选择Uninstall

还有一个方法就是用gacutil -u [myassebly] ,也可以卸载.

PS:sn.exe 和gacutil.exe在你安装了VS后,在%programfiles%\Microsoft SDKs\Windows\v7.0A\bin 下可以找到(标注出来的地方是根据你装的VS的版本不同变化的) ,关于sn.exe和ganutil.exe的用法大家可以自己去研究,在CMD下sn.exe -? 一下即可.

注:我所用的环境是VS2010RC,Win7 ultimate

posted on 2010-06-06 22:40  nett  阅读(3266)  评论(3编辑  收藏  举报