[转]程序集之GAC---Global Assembly Cache
本文转自:http://www.cnblogs.com/jhxk/articles/2564295.html
1、什么是GAC?GAC解决什么问题?
GAC全称为: Global Assembly Cache(全局程序集缓存),你可以在你的电脑的系统盘如:C:\Windows\assembly\看到目前计算机上安装的GAC。
举一个最简单的例子,很多初学.NET的开发人员进行数据访问都是从SqlHelper.cs开始的,SqlHelper是一个数据访问对象,提供对数据库操作的各种方法,名字大概是学从PetShop吧,样子大概是这个样子, 又或是这个样子,且不管长啥样,如果部署在服务器上的多个应用都使用此对象,那么基本上会有下面几种类似的处理方法:
(1)将此类直接拷贝到项目中使用;
(2)建一个类库项目,包含此类,然后编译为dll,再在应用中添加引用以使用此程序集中的SqlHelper;
(3)将(2)中的dll注册为GAC,直接在应用中使用,就像使用System.IO、System.Net一样 ;
当SqlHelper.cs更新后,对于(1)和(2)你可能会感觉到非常痛苦,因为要逐个应用去替换,而对于(3)则简单多了,只需要将编译后的dll重新注册到GAC就可以了。
记得在MSDN曾经看到过一句话,说是“.NET程序集解决了DLL Hell”的问题。
说这里,先说个故事:有一天,一个朋友的同事问我,“写过动态链接库吗?”, 我一时竟然没想起是什么,平常说dll太多了,几乎都忘记“动态链接库”这几个字了,不过还好,脑子里还有抹不去的记忆。
“.NET程序集解决了DLL Hell”关键一点就是相同名称而不同版本的程序集可以共存,打开Assembly所在目录,如:C:\Windows\assembly,看一下就比较清楚了。
可以思考一下,为什么同一系统中可以安装多个版本的.NET Framework、Visual Studio;而有些软件是不行的,只能存在唯一版本,大概就是这个道理。
2、将DLL注册到GAC
(1)创建DLL:新建一个类库项目,名称为GACDemo,再添加一个类,如:
using System.Text;
namespace GACDemo { public class Function { //计算字符串长度,中文及全角算1,其它算0.5 public static int GetStringLength(string text) { int Len = 0; //记录非中文、非全角字符为0.5个长度 float charLen = 0; char[] chars = text.ToCharArray(); for (int i = 0; i < chars.Length; i++) {
int charLength = Encoding.UTF8.GetByteCount(chars[i].ToString()); if (charLength == 3) { Len++; } else { if (charLen == 0.5) { charLen = 0; } else { charLen = 0.5f; Len++; } } } return Len; } } }
右击项目,有菜单中选择属性,按如下操作生成强命名Key (GAC中的Assembly必须是strong-name的 )
然后编译,之前我注册过一次,版本为1.0.0.0,编译之前,我将版本修改为了2.0.0.0。
(2)注册
以管理员身份运行命令行
进入到类库项目的bin/debug目录,执行gacutil -if gacdemo.dll
查看 C:\Windows\assembly
两个版本并存。
3、在ASP.NET中使用GAC
这个就简单了,新建一个ASP.NET网站,添加引用,写如下测试代码
using System; using GACDemo;
namespace gacwebdemo { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.Write(Function.GetStringLength("hello")); } } }
编译网站。
在IIS中发布网站:
VS2008直接右击项目发布网站。
VS2010右击网站点击发布,选择文件系统。
发布后的文件目录:
然后在IIS中发布网站(这里是IIS7):
然后浏览default.aspx,看到输出的结果是3。
需要注意的是.NET4.0和以往2.0、3.0、3.5在GAC中安装程序集有所不同:
因为.Net 4.0 和 .Net 2.0 采用了不同的 CLR, 所以现在 Windows里有两个GAC.
CLR 2.0 的 GAC 依然是在 C:\Windows\assembly\, 而CLR 4.0 的 GAC 则在 C:\Windows\Microsoft.NET\assembly。
打开 CLR 4.0 的 GAC,你会看到三个文件夹, GAC32, GAC64,和GAC_MSIL。
顾名思义,GAC32就是x86平台的,GAC64是x64的(注:intel64和AMD64可以都被称为"amd64"),而GAC_MSIL是两种平台都可以的(编译的时候any cpu)。
使用gacutil工具安装程序集到GAC中:.dll程序集被放到GAC_MSIL目录,而.exe程序集被放到GAC32目录
要在GAC中安装程序集,首先还是要给程序集强命名。但是CLR 4.0 的GAC 不再支持拖拽的安装了,所以你只能老老实实的使用命令来安装。
gacutil /i SharedAssembly.dll -- 安装
gacutil /l SharedAssembly --查看
gacutil /u SharedAssembly --卸载
其它参考资料:
[转]程序集之GAC---Global Assembly Cache的更多相关文章
- 将.NET dll注册到GAC(Global Assembly Cache)中
当发现有多个解决方案引用一个dll时,为了不重复引用所以将.net的一个dll注册到GAC中去. gacutil.exe. 记得使用管理员权限打开 开始菜单-Microsoft Visual Stud ...
- GAC(Global Assembly Cache)注册/卸载 dll
当发现有多个解决方案引用一个dll时,为了不重复引用所以将.net的一个dll注册到GAC中去. gacutil.exe. 记得使用管理员权限打开 开始菜单-Microsoft Visual Stud ...
- 配置到 Framework GAC(Global Assembly Cache) Assembly
配置到 Framework 通常有两种方法,一种是直接把它放到GAC(Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly)中 :另一种是把它们放到具体 ...
- [转]How to Clean the Global Assembly Cache
本文转自:https://www.techwalla.com/articles/how-to-clean-the-global-assembly-cache The Global Assembly C ...
- Failed to add reference to 'System.Net.Http'. Please make sure that it is in the Global Assembly Cache.
关闭VS再来就好了
- 在Win7中安装程序集到GAC
原文:在Win7中安装程序集到GAC 微软为提高系统安全,自Vista推出后,在Windows系统中加入了一个新的东东——UAC(User Account Control),这样一个新的技术使得许多操 ...
- 针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)
错误: 针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_A ...
- 强名称程序集(strong name assembly)——为程序集赋予强名称
,唯一标识一个程序集 2,放置程序集被仿冒和被篡改. 3,能够部署到全局程序集缓存(GAC:GlobalAssembly Cache)中:在将强名称程序集不熟在GAC其中以后,强名称程序集也能够称为共 ...
- C#通过代码判断并注册程序集到GAC
var dllName = "EasyHook.dll"; var dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirec ...
随机推荐
- springmvc 使用Jackson的配置
<!--start:使用Jackson 1.x的配置,需要导入的jar包:jackson-core-lpgl-xxx.jar.jackson-mapper-lgpl-xxx.jar --> ...
- [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作
基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作 转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...
- virtualenv基本使用
win 安装 virtualenv pip3 install virtualenv 创建虚拟环境 virtualenv env1 进入虚拟环境 env1/Scripts/activate 退出虚拟环境 ...
- emacs之切换h/cpp配置
emacsConfig/switch-file-setting.el (defun switch-c () (global-set-key (kbd "<C-return>&qu ...
- AHK按键转载
AHK按键一个顶三个 需求: 我想要,用win键代替3个键,代替了之后, 以后用win+任意键,例如: 就是win+1就是ctrl+alt+shift+1 其中1是可以变的. 解决:考虑到win键比较 ...
- app遍历——appCrawler的使用
1.appCrawler环境配置 1.1 apkinfo获取安装包的报名和mainActivity https://github.com/codeskyblue/apkinfo/releases 使用 ...
- 华为5573+联通4G上网SIM+ROS hap ac-RB962UiGS-5HacT2HnT 上网
华为5573+联通4G上网SIM+ROS hap ac-RB962UiGS-5HacT2HnT 上网 原理其实是这样的,ROS的USB口连接华为5573: 华为5573看成是一个路由器,他的外网网卡走 ...
- Hive新功能 Cube, Rollup介绍
说明:Hive之cube.rollup,还有窗口函数,在传统关系型数据(Oracle.sqlserver)中都是有的,用法都很相似. GROUPING SETS GROUPING SETS作为GROU ...
- 【UVALive】4094 WonderTeam(神结论)
题目 传送门:QWQ 分析 好神的结论啊 看代码吧(Length只有85) 代码 顺手压了压代码 目前代码长度rk1 vjudge #include <iostream> ?:n ...
- leetcode225
public class MyStack { Queue<int> Q = new Queue<int>(); /** Initialize your data structu ...