注册使用GAC—Global Assembly Cache(.NET)

本文将一些资料进行整理,后面附带Demo。

 

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

GAC全称为: Global Assembly Cach(全局程序集缓存),你可以在你的电脑的系统盘如: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网站,添加引用,写如下测试代码

ExpandedBlockStart.gif
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。

 

其它参考资料:

 

在 GAC 中安装程序集

如何在 GAC 中安装程序集 

Global Assembly Cache 

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

转载于:https://www.cnblogs.com/Ferry/archive/2010/12/17/1908817.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值