.NET技术

暂无签名

  • 博客访问: 2270680
  • 博文数量: 3718
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-04 14:46
个人简介

暂无介绍

文章分类

全部博文(3718)

文章存档

2010年(596)

2009年(1085)

2008年(2037)

我的朋友
微信关注

IT168企业级官微



微信号:IT168qiye



系统架构师大会



微信号:SACC2013

订阅
如何把assembly加到GAC中? 2010-06-07 14:10:10

分类: Linux

首先要说一下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

阅读(1174) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~

iDotNetSpace2010-06-07 14:12:38

如何把assembly加到GAC中?这篇文章已被推荐到.NET企业技术交流圈子中。

评论热议
请登录后评论。

登录 注册