zoukankan      html  css  js  c++  java
  • 我所知道的GAC(Global Assembly Cach)

    Q:什么是GAC?

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

    Q:GAC作用?

    A:GAC的作用是可以存储一些有多个应用都要用到的公共的Assembly(程序集),例如System.Data、System.Windows.Forms等。这样,多个应用就可以从GAC中取得

    Assembly,而不需要在所有应用中把要用到的Assembly都拷贝到应用程序的相关目录下面(比如:Windows应用程序的Debug目录,ASP.NET的bin目录)。

    DEMO      

           举一个最简单的例子,很多初学.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)注册

    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。

    其它参考资料:

    在 GAC 中安装程序集

    如何在 GAC 中安装程序集 

    Global Assembly Cache 

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


  • 相关阅读:
    数据预处理之中心化(零均值化)与标准化(归一化)
    机器学习入门篇——感知器
    JAVA实现QQ聊天气泡
    设计模式学习笔记—策略模式
    JComboBox实现时间控件
    JTree实现QQ好友列表
    JAVA实现带图片的列表——JList
    JAVA与数据库MySQL相连接
    SQL语句
    HTML学习笔记——标签(二)
  • 原文地址:https://www.cnblogs.com/yhql/p/2375132.html
Copyright © 2011-2022 走看看