C#程序集系列11,全局程序集缓存

全局程序集缓存(GAC:Global Assembly Cache)用来存放可能被多次使用的强名称程序集。当主程序需要加载程序集的时候,优先选择到全局程序集缓存中去找寻需要的程序集。

为什么需要全局程序集缓存?
假设程序A引用B程序集,程序C也引用B程序集,在这种情况下,可以把B程序集放到一个全局程序集缓存中是明智的做法。

□ 使用全局缓存程序集

→删除F盘as文件夹中所有dll和exe后缀的文件
→编译Cow.cs成程序集

→把刚创建的Farm.dll存放到全局程序集缓存中

报错是因为,非强名称程序集是无法保存到全局程序集缓存中的。
→重新编译Cow.cs,这次使用密匙

→再次把Farm.dll存放到全局程序集缓存中

如果想把一个强名称程序集从全局缓存中取出:gacutil -u farm
→编译MainClass.cs成可执行文件,引用Farm.dll

→用记事本打开MainClass.cs,修改如下,保存

using System;

class MainClass
{
    static void Main()
    {
        Cow.Moo();
        Cow.Moo();
        Cow.Moo();
    }
}

→再次编译MainClass.cs,引用现在已经在全局程序集缓存中的Farm.dll

→把Farm.dll从as文件夹中删除,因为已经存放到全局程序集缓存中了

→再次运行MainClass.exe和AnotherMainClass.exe

说明已经在使用全局程序集缓存中的Farm.dll了。

□ 全局缓存程序集在哪里

在"C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Farm\v4.0_3.3.3.3__863de8402b3a9978"文件夹中

总结:
○ 当程序集可能被多次引用,可以考虑把程序集放入全局程序集缓存
○ 自定义程序集和.NET默认的一些程序集,都被放在"C:\Windows\Microsoft.NET\assembly\GAC_MSIL"了这个全局程序集缓存文件夹中
○ C#编译器会先优先到全局程序集缓存中找寻程序集

时间: 2024-10-09 11:11:46

C#程序集系列11,全局程序集缓存的相关文章

C#程序集系列13,如何让CLR选择不同版本的程序集

本篇主要体验,在存在多个版本程序集的情况下,如何让CLR选择哪个版本程序集运行,以及程序集版本的切换. 分别生成非强名称程序集不同版本 □ 生成某个版本的程序集 →清理F盘as文件夹,剩下如下文件 →查看Cow.cs文件 using System; using System.Reflection; [assembly: AssemblyVersion("3.3.3.3")] public class Cow { public static void Moo() { Console.Wr

Gacutil.exe(全局程序集缓存工具)

全局程序集缓存 .NET Framework (current version) 其他版本 安装有公共语言运行时的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存.全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集. 应当仅在需要时才将程序集安装到全局程序集缓存中以进行共享.一般原则是:程序集依赖项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集.另外,不必为了使 COM 互操作或非托管代码可以访问程序集而将程序集安装到全局程序集缓存. 注意 在有些情况下

全局程序集缓存工具(Gacutil.exe)用法详解

全局程序集缓存工具 (Gacutil.exe) 全局程序集缓存工具使您可以查看和操作全局程序集缓存和下载缓存的内容. 复制 gacutil [options] [assemblyName | assemblyPath | assemblyListFile] 参数 参数 说明 assemblyName 程序集的名称.可以提供部分指定的程序集名称(如 myAssembly)或完全指定的程序集名称(如 myAssembly, Version=2.0.0.0, Culture=neutral, Publ

C#中的全局程序集缓存定义

安装有公共语言运行时的每台计算机都具有称为全局程序集缓存的计算机范围内的代码缓存.全局程序集缓存中存储了专门指定给由计算机中若干应用程序共享的程序集. 应当仅在需要时才将程序集安装到全局程序集缓存中以进行共享.一般原则是:程序集依赖项保持专用,并在应用程序目录中定位程序集,除非明确要求共享程序集.另外,不必为了使 COM 互操作或非托管代码可以访问程序集而将程序集安装到全局程序集缓存. 有两种方法可以将程序集部署到全局程序集缓存中: 使用专用于全局程序集缓存的安装程序.该方法是将程序集安装到全局

Skype For Business 2015实战系列11:创建并发布拓扑

Skype For Business 2015实战系列11:创建并发布拓扑 Skype For Business Server安装前需要先定义好拓扑,因为我们要在拓扑中的每台服务器上安装 Skype for Business Server 系统,必须首先创建和发布一个拓扑.发布拓扑时,拓扑信息会载入中央管理存储数据库.如果这是 Enterprise Edition 池,您将在初次发布新拓扑时创建中央管理存储数据库.如果是 Standard Edition,则需要运行部署向导中的"准备第一个 St

Spring基础系列11 -- 自动创建Proxy

Spring基础系列11 -- 自动创建Proxy 转载:http://www.cnblogs.com/leiOOlei/p/3557964.html 在<Spring3系列9- Spring AOP——Advice>和<Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法>中的例子中,在配置文件中,你必须手动为每一个需要AOP的bean创建Proxy bean(ProxyFactoryBean). 这不是一个好的体验,例如,你想让DAO层

C#程序集系列09,程序集签名

在"C#程序集系列08,设置程序集版本"中体验了为程序集设置版本,但对于程序集的安全性来说,还远远不够.本篇体验程序集的签名. □ 程序集的签名 →F盘as文件夹下有多个文件→在程序集所在文件夹创建密匙→打印密匙密匙是一堆乱码,这是经过加密了.→在密匙的基础上创建公匙Public Key→打印公匙Public Key注意:这里的public token是public key经过哈希算法而获得的.当程序集被引用,该程序集对外是以public token形式存在的. →现在重新编译&quo

【转】Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

概要 前一章,我们学习了HashMap.这一章,我们对Hashtable进行学习.我们先对Hashtable有个整体认识,然后再学习它的源码,最后再通过实例来学会使用Hashtable.第1部分 Hashtable介绍第2部分 Hashtable数据结构第3部分 Hashtable源码解析(基于JDK1.6.0_45)第4部分 Hashtable遍历方式第5部分 Hashtable示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3310887.h

C#程序集系列06,程序集清单,EXE和DLL的区别

CLR在加载程序集的时候会查看程序集清单,程序集清单包含哪些内容呢?可执行文件和程序集有什么区别/ 程序集清单 □ 查看程序集清单 →清空F盘as文件夹中的所有内容→创建MainClass.cs文件→把MainClass.cs编译成程序集→反编译MyDll.dll,在1.txt文件中呈现 ildasm /out:1.txt MyDll.dll →打开1.txt文件 1.txt // Metadata version: v4.0.30319 .assembly extern mscorlib {