在.net中使用GAC

GAC

GAC是什么?是用来干嘛的?GAC的全称叫做全局程序集缓存,通俗的理解就是存放各种.net平台下面需要使用的dll的地方。GAC的具体目录在windows/assembly。

喜欢使用破解软件的朋友可能会经常使用替换DLL这招,这个DLL虽然和.net下面的DLL有所不同,但大致起的作用还是一样的:使用共同的动态链接库来提高库复用,减少文件体积。在.net平台之前,程序们都把可能用到的公共DLL存放到system32文件夹下。由于版本的不一致及其他原因(将控制信息存放到注册表),造成了很有名的DLL Hell。

最近在读俞甲子的《程序员的自我修养》,中间花了很大的篇幅描述程序编译中的链接这个过程。而比较巧合的是,我的《C#与.NET 3.5高级程序设计》也正好读到程序集这一块。微软使用了GAC来避免DLL重蹈覆辙。现在,我就来部署一个简单的通用类库到GAC中。

获取强名称(签名)

并不是随便一个DLL都可以放到GAC中,如果这样的话,和之前的DLL Hell也没什么区别了。GAC使用一个强名称(签名)的方式来区分不同的DLL。每个签名都是独一无二的公钥私钥对。现在我们使用SDK的sn工具为我的DUtil库生成一个snk签名。

打开SDK中的Visual Studio 2008 命令提示,键入sn -k DUtil.snk,结果如下:

view source print?
1 F:\WorkSpace\.net\DUtil\bin\Debug>sn -k DUtil.snk
2   
3 Microsoft (R) .NET Framework 强名称实用工具 版本 3.5.21022.8
4 Copyright (c) Microsoft Corporation.  All rights reserved.
5   
6 密钥对被写入 DUtil.snk

这样我们就得到了一个snk签名文件。

为程序集设置签名

现在我们得到了一个签名文件,但是还没有把这个签名应用到程序中,在程序的assembly.cs文件中加入[assembly: AssemblyKeyFile("dutil.snk")],这个dutil.snk可以是绝对路径,我使用的是主目录中的snk文件。

编译解决方案,生成的.dll文件就包含了签名。

此时编译器会出现一个警告:

警告 1 使用命令行选项“/keyfile”或适当的项目设置代替“AssemblyKeyFile” F:\WorkSpace\.net\DUtil\Properties\AssemblyInfo.cs 38 12 DUtil

既然VS建议我们用选项设定,那我们就用项目选项页设定key。如下图所示:

PS:我测试过,生成DLL之后,就算删除签名使用的snk文件,依然可以正常使用。即snk文件只有在编译时候使用。

安装到GAC

安装到GAC有两种办法,一种是把DLL拖入windows/assembly目录下(不是复制粘贴,是拖动),另外一种是使用gacutil。

在Win7下,拖动的话会遇到权限问题,如下图所示

在gacutil下面也会遇到如下错误

view source print?
1 F:\WorkSpace\.net\DUtil\bin\Debug>gacutil -i DUtil.dll
2 Microsoft (R) .NET Global Assembly Cache Utility.  Version 3.5.21022.8
3 Copyright (c) Microsoft Corporation.  All rights reserved.
4   
5 将程序集添加到缓存失败: 拒绝访问。您可能没有执行此任务的管理凭据。请与您的系统管
6 理员联系以获得帮助。

解决的办法就是进入命令行时候用管理员身份进入,执行之后显示如下

view source print?
1 F:\WorkSpace\.net\DUtil\bin\Debug>gacutil -i DUtil.dll
2 Microsoft (R) .NET Global Assembly Cache Utility.  Version 3.5.21022.8
3 Copyright (c) Microsoft Corporation.  All rights reserved.
4   
5 程序集已成功添加到缓存中

这时候查看windows/assembly目录,就会发现DUtil已经在里面了。

用TotalCommander打开windows/assembly,会发现里面有GAC/GAC_32/GAC_MSIL这几个文件夹,我的DUtil安装到c:\Windows\assembly\GAC_MSIL\DUtil\0.1.0.0__35f4c1ba225b3cc6\DUtil.dll,这个路径包含了版本,签名,通过这种方式,就能避免版本和错误dll的问题了。

使用GAC的dll

打开任意一个项目,添加引用时候,选择编译出来的DUtil.dll即可。查看具体属性,就会发现,这个DLL并未复制到本地,因为它可以从GAC中获取了。

这时候如果我们删除引用地方的DLL,会发现程序依然可以正确跑起来,说明我们的DLL确实来自GAC。(Update:当引用DLL文件存在时候,优先引用此DLL,不存在才引用GAC的DLL)

PS:不要尝试去打开windows/assembly目录来引用,你会发现你徒劳的。

卸载GAC中的DLL

一句话搞定

view source print?
01 C:\Windows\system32>gacutil -u DUtil
02 Microsoft (R) .NET Global Assembly Cache Utility.  Version 3.5.21022.8
03 Copyright (c) Microsoft Corporation.  All rights reserved.
04   
05 程序集: DUtil, Version=0.1.0.0, Culture=neutral, PublicKeyToken=35f4c1ba225b3cc6
06 , processorArchitecture=MSIL
07 已卸载: DUtil, Version=0.1.0.0, Culture=neutral, PublicKeyToken=35f4c1ba225b3cc6
08 , processorArchitecture=MSIL
09 卸载的程序集数 = 1
10 失败次数 = 0

这样就把特定目标的DLL卸载了。

转载于:https://www.cnblogs.com/ahghy/archive/2011/08/25/2153385.html

在.net中使用GAC相关推荐

  1. GAC中的所有的Assembly都会存放在系统目录%winroot%/assembly下面

    是的,GAC中的所有的Assembly都会存放在系统目录"%winroot%/assembly下面.放在系统目录下的好处之一是可以让系统管理员通过用户权限来控制Assembly的访问.   ...

  2. C# 注册DLL至GAC 并在添加引用中使用该DLL

    1,创建一个强签名的类库 类库属性中新建秘钥文件 或者使用工具 使用命令sn -k mykey.snk生成snk文件.生成好的文件在C:\Windows\SysWOW64路径下. 2,管理员身份运行 ...

  3. .NET 4.0有一个新的GAC,为什么?

    本文翻译自:.NET 4.0 has a new GAC, why? %windir%\\Microsoft.NET\\assembly\\ is the new GAC . %windir%\\Mi ...

  4. 在Windows 7解决GAC错误

    调试一网站源代码出现下面的错误 错误 1 Could not load file or assembly 'Microsoft.ReportViewer.WebForms, Version=8.0.0 ...

  5. C#中的程序集和命名空间

    作为一个.NET程序员有必要对命名空间和程序集有明确的认识,下文很好解释了这两者的关系,感谢作者! 本文转自:http://www.cnblogs.com/netlyf/archive/2009/09 ...

  6. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  7. [转]程序集之GAC---Global Assembly Cache

    本文转自:http://www.cnblogs.com/jhxk/articles/2564295.html 1.什么是GAC?GAC解决什么问题? GAC全称为: Global Assembly C ...

  8. .NET 5 的重大改变:消失的历史技术

    在本文中,我们将回顾一些未能进入.NET Core 的历史性.NET 技术.有趣之处在于,这些技术的 API 被复制过来了,这暗示着微软当时在考虑将来在.NET Core 中对它们进行实现. 全局程序 ...

  9. (转载)20分钟读懂程序集

    转自:http://www.cnblogs.com/damonlan/p/3221347.html 说到程序集,我刚开始对这个名词特别的郁闷!~.然后 前些天花了些时间 好好读了一下,现在比较清晰了, ...

  10. ASP.NET使用管道模型(PipleLines)处理HTTP请求

    大多数人认为ASP.NET仅仅只是页面--使用模板来创建HTML页面然后返回给浏览器.但是这仅仅只是ASP.NET使用HTTP管道模型处理WEB程序很小的一方面.管道模型是类似于Web Service ...

最新文章

  1. jquery选中checkbox
  2. ML之XGBoost:XGBoost算法模型(相关配图)的简介(XGBoost并行处理)、关键思路、代码实现(目标函数/评价函数)、安装、使用方法、案例应用之详细攻略
  3. hdu 3065 病毒侵袭持续中(AC自动机)
  4. Intent 简单用法
  5. linux磁盘资源,liunxCPU和内存,磁盘等资源,
  6. 三年Java,真的卷不动了……
  7. 工作笔记-安装完virtualbox,新建好虚拟机却提示无法打开
  8. sklearn网格搜索GridSearchCV得到各个评价指标的均值与方差
  9. 【ABAP系列】SAP ABAP 宏的简单使用
  10. 广义矩估计的一般步骤_【基本无害】动态理性预期理论与广义矩估计02
  11. keil c语言循环嵌套,keil软件中C语言嵌套汇编
  12. 百度地图API地理位置和坐标转换 城市坐标
  13. OpManager-系统性能监控工具
  14. 测试页能打印 软件不能打,Windows7分享打印机能打测试页打印文件怎么没反应
  15. Maven镜像仓库配置地址
  16. Xposed模拟位置
  17. 渗透测试实验_安装Windows7旗舰版
  18. WebSocket长连接因为网络波动而导致客户端的“假离线”---问题发现、分析到解决
  19. 【Unity2D】制作可以左右移动的平台
  20. Swift基础(六)解包

热门文章

  1. 在vue的项目中引入swiper插件
  2. 使用react定义组件的两种方式
  3. Mac Python IDLE中如何更改字体
  4. vs2010设置 行号显示
  5. 中国农历2013,2014 (zz.IS2120@BG57IV3)
  6. android报错自动重启,Android Studio常见报错及处理办法
  7. IBM PowerAI编程大赛Q2场来袭!探秘金融语料大数据识别
  8. Cloudera Manager 安装 CDH5.x 心得
  9. mysql搭建及数据迁移教程
  10. 关于期权的若干硬知识,知道这些就不那么担心了