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

本文转自:http://www.cnblogs.com/jhxk/articles/2564295.html

1、什么是GAC?GAC解决什么问题?

GAC全称为: Global Assembly Cache(全局程序集缓存),你可以在你的电脑的系统盘如:C:\Windows\assembly\看到目前计算机上安装的GAC。

GAC的作用是可以存储一些有多个应用都要用到的公共的Assembly(程序集),例如System.Data、System.Windows.Forms等。这样,多个应用就可以从GAC中取得 Assembly,而不需要在所有应用中把要用到的Assembly都拷贝到应用程序的相关目录下面(比如:Windows应用程序的Debug目录,ASP.NET的bin目录)。

举一个最简单的例子,很多初学.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 中安装程序集

如何在 GAC 中安装程序集

Global Assembly Cache

如何在 Visual C# .NET 中将程序集安装到全局程序集缓存

时间: 2024-07-30 12:57:52

[转]程序集之GAC---Global Assembly Cache的相关文章

将.NET dll注册到GAC(Global Assembly Cache)中

当发现有多个解决方案引用一个dll时,为了不重复引用所以将.net的一个dll注册到GAC中去. gacutil.exe. 记得使用管理员权限打开 开始菜单-Microsoft Visual Studio 2015 -VS2015 开发人员命令提示,在控制台中输入 gacutil.exe 回车,既可以看到一些参数. 输入:gacutil.exe -i dll路径 原文出自:http://www.cnblogs.com/PurpleCow/archive/2012/02/07/2341960.ht

GAC(Global Assembly Cache)注册/卸载 dll

当发现有多个解决方案引用一个dll时,为了不重复引用所以将.net的一个dll注册到GAC中去. gacutil.exe. 记得使用管理员权限打开 开始菜单-Microsoft Visual Studio 2015 -VS2015 开发人员命令提示,在控制台中输入 gacutil.exe 回车,既可以看到一些参数. 输入:gacutil.exe -i dll路径 卸载dll 输入:gacutil.exe -u dll名字(不加.dll后缀) @import url(http://i.cnblog

配置到 Framework GAC(Global Assembly Cache) Assembly

配置到 Framework 通常有两种方法,一种是直接把它放到GAC(Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly)中 :另一种是把它们放到具体的程序目录下. 要放到GAC里面,简单的方法就是直接把卫星配件拖放到"Windows/assembly"目录下,也可以使用Microsoft提供的工具gacutil,使用如下命令: gacutil /i:LocalizerRes.zh-CHS.resources.dll 如果不放到GAC中

[转]How to Clean the Global Assembly Cache

本文转自:https://www.techwalla.com/articles/how-to-clean-the-global-assembly-cache The Global Assembly Cache (GAC) folder in Microsoft Windows stores assemblies common to multiple applications. An assembly is a single, compiled unit that contains informa

在Win7中安装程序集到GAC

原文:在Win7中安装程序集到GAC 微软为提高系统安全,自Vista推出后,在Windows系统中加入了一个新的东东——UAC(User Account Control),这样一个新的技术使得许多操作都受到了约束,尤其是对系统设置.文件的修改,Win7作为一个衍生品,也受到了UAC的保护. 在.NET项目开发中,针对一些类库项目或用户控件项目,当程序开发完成后,有时需要将开发的程序集,安装部署到GAC(Global Assembly Cache)中,以便其他的程序也可以调用. 通常,将程序集安

针对程序集 &#39;SqlServerTime&#39; 的 ALTER ASSEMBLY 失败,因为程序集 &#39;SqlServerTime&#39; 未获授权(PERMISSION_SET = EXTERNAL_ACCESS)

错误: 针对程序集 'SqlServerTime' 的 ALTER ASSEMBLY 失败,因为程序集 'SqlServerTime' 未获授权(PERMISSION_SET = EXTERNAL_ACCESS). 当符合以下两个条件之一时,将对程序集授权: 数据库所有者(DBO)具有 EXTERNAL ACCESS ASSEMBLY 权限,而且数据库的 TRUSTWORTHY 属性处于打开状态:或者,程序集签名时所使用的证书或非对称密钥所对应的登录名具有 EXTERNAL ACCESS ASS

强名称程序集(strong name assembly)——为程序集赋予强名称

引言: 在以前的项目开发中,在程序集中见到过一个后缀为*.snk的文件,当时看这个文件的图标,感觉可能是企业内部保护版权啥的一种方式. 一,强程序集解决了哪些问题? 1,唯一标识一个程序集 2,放置程序集被仿冒和被篡改. 3,可以部署到全局程序集缓存(GAC:GlobalAssembly Cache)中:在将强名称程序集不熟在GAC当中以后,强名称程序集也可以称为共享程序集(shared assembly) 二,强名称与GAC 强名称: 定义了一个规则,不单单以文件名来区分程序集,这个规则就是强

C#通过代码判断并注册程序集到GAC

var dllName = "EasyHook.dll"; var dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, dllName); if (System.Runtime.InteropServices.RuntimeEnvironment.FromGlobalAccessCache(Assembly.LoadFrom(dllPath))) new System.EnterpriseServices.Inte

批文件注册程序集

原文:批文件注册程序集 1. 新建一个解决方案,命名为GAC. 2. 添加一个Class Library类库,命名为DbConn. using System; using System.Collections.Generic; using System.Text; namespace DbConn { public class Class1 { public string GetCustomer() { return "Hello World!"; } } } 3. 在解决方案中继续添