转:http://www.yl1001.com/userzone.htm?doaction=article&art_id=5851381388387201

我们一般都知道,.NET Framework的GAC(global assembly cache)其实就是一个特殊的目录,如下图所示

再谈CLR:.NET Framework GAC目录构造 
 
但是它内部到底是什么结构呢? 
 

再谈CLR:.NET Framework GAC目录构造 
 
    很奇怪对吧?两个图完全不一样。不要惊讶,其实第一个图只是一个特殊的呈现方式。GAC里面确实就只有几个目录而已 。
 
   一个比较完整的.NET Framework 2.0的GAC下子目录的结构如下所示:
 
GAC 
GAC_32 
GAC_MSIL 
GAC_64 
NativeImages1_v1.1.4322 
NativeImages_v2.0.50727_32 
NativeImages_v2.0.50727_64 
其中:
 
GAC是用于存放基于.NET Framework 1.0/1.1创建的Assemblies,这些Assemblies只能运行在32-bit 地址空间。
 
GAC_MSIL用于存放基于.NET Framework 2.0上的无特定CPU指定的Assemblies,这些assemblies可以运行在32-bit地址空间或者64-bit地址空间。
 
GAC_32也是用于存放基于.NET Framework 2.0创建的基于x86架构的Assemblies,因为这些Assemblies可以拥有32-bit的native CPU代码,所以只能运行在32-bit空间,可以直接在32-bit系统上运 行或者使用WOW64技术在64-bit的OS系统上运行。
 
GAC_64用于存放.NET Framework 2.0上创建的基于x64或者IA64的Assemblies,这些Assemblies可能含有x64或者IA64的Native Code,所以他们只能运行在64-bit地址空间上。这个目录在32-bit的 OS上不存在。值得注意的是,GAC_64中的Assemblies是根据系统架构决定,在x64系统上,该目录中的Assemblies就必须是基于x64的,IA64的Assemblies无法被装入,反之亦然。
 
以NativeImages开头的目录存放的通过NGen.exe编译assembly生成的基于当前平台的非managed代码,这个目录不需要Strongly named Assemblies,后面的数字对应了版本号。而基于.NET Framework 2.0的两个NativeImages目录名称最后的两个字符’64’和’ 32’则代表了对应的平台。
 
  那么,如果我们往里面去查看呢?会发现什么呢?
 

再谈CLR:.NET Framework GAC目录构造 
 
也就是说,在某个目录中(以GAC_MSIL为例),又按照程序集名称分了目录,例如System是一个程序集名称。它就有一个目录。
 
那么,它是怎么区分版本的呢?其实很简单,在程序集内部又按照版本号和公钥分了子目录。然后才可以看到真正的dll
 

再谈CLR:.NET Framework GAC目录构造 
 
这样做的目的是什么呢?就是说,即便程序集名称和版本都一样,但是签名的密钥是不一样的话,他们仍然是可以区分的。要知道,程序集名称和版本号完全可以设置成一样的,但密钥是不可能模 拟出来的。
    最后,我们需要谈一个话题,就是CLR在查找程序集时的行为模式?意思就是说,如果一个程序集,它需要引用另外一个程序集,那么CLR到底是怎么查找的
 
    好吧,有朋友可能会问:等等,CLR是怎么知道一个程序集需要引用另外的程序集呢?
 
    Good question! 其实这是必须的. 一个程序集不光包含代码,还包含了其他一些东西,例如程序集元数据, 类型元数据,以及资源等等.
 
   从下面的图形可以看到一个MANIFEST,它里面就有有关引用的信息
 

再谈CLR:.NET Framework GAC目录构造 
 
    查看MAINFEST,我想你就明白了吧 。看下图的assembly extern mscorlib。这说明什么呢?意思就是说目前的这个程序集需要用到mscorlib,而且版本和公钥是什么 
 

再谈CLR:.NET Framework GAC目录构造 
 
    Ok,那么如果知道了这些信息,CLR是怎么找到mscorlib的呢?它一般情况下是遵循下面的关系
 
1. 程序集的根目录
 
2. GAC(应该是先找平台相关的目录,例如GAC_32,GAC_64,然后找GAC_MSIL)
 
3.如果上面都找不到,则继续查找当前程序是否设置了特殊的私有路径。
 
如果以上都找不到,就报告一个错误,失败了
 
以上的过程是发生在运行期间的。
 
   那么在编译的时候,又是怎么样的呢?
 
1. 程序集的根目录
 
2. CSC程序的目录
 
3. GAC

NET Framework GAC目录构造的更多相关文章

  1. 配置到 Framework GAC(Global Assembly Cache) Assembly

    配置到 Framework 通常有两种方法,一种是直接把它放到GAC(Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly)中 :另一种是把它们放到具体 ...

  2. [Learn AF3]第一章 如何使用App Framework 3.0 构造应用程序

    af3的变化非常大.参见[译]Intel App Framework 3.0的变化 一.应用需要引用的js脚本: af3中不在自己实现dom选择器,而是选择基于jquey或兼容jquery的库如zep ...

  3. Java Collections Framework知识结构目录

    The core collection interfaces are the foundation of the Java Collections Framework. The Java Collec ...

  4. .net framework 4.0 从 GAC 卸载 程序集

    .net framework 4.0 的 GAC 目录: C:\Windows\Microsoft.NET\assembly\GAC_MSIL 要卸载,仍然使用 gacutil 命令,不要带扩展名: ...

  5. MVC 程序在编译时提示 GAC与 Temporary ASP.NET Files目录内引用文件版本不一致

    今天在调试Mvc程序时,提示GAC与Temporary ASP.NET Files目录内引用文件版本不一致. [A]System.Web.WebPages.Razor.Configuration.Ho ...

  6. GAC的理解及其作用

    转:http://www.cnblogs.com/smallstone/archive/2010/06/29/1767508.html 一.GAC的作用 全称是Global Assembly Cach ...

  7. 使用Mono Runtime Bundle制作安装包让C#桌面应用程序脱离net framework

    在Xamain 未被收购之前,这货monodroid.exe  就是一个打包的绑定...无奈 配置环境复杂,未能实现 ...有mono运行时就行了..不折腾了 玛德 让C#程序独立运行(脱离 .NET ...

  8. GAC简述

    GAC简介 GAC全称是Global Assembly Cache作用是可以存放一些有很多程序都要用到的公共Assembly,例如System.Data.System.Windows.Forms等等. ...

  9. 使用Qt installer framework制作安装包

    一.介绍 使用Qt库开发的应用程序,一般有两种发布方式:(1)静态编译发布.这种方式使得程序在编译的时候会将Qt核心库全部编译到一个可执行文件中.其优势是简单单一,所有的依赖库都集中在一起,其缺点也很 ...

随机推荐

  1. SQL的update from 理解

    学习了sql的语句都有快3年,工作上使用都一年半的,最近突然想起update from语句,感觉好像很模糊,虽然语法上使用一直正确,一直都是这样使用,但是就好像不是很明白里面的深处意思. 今天特意测试 ...

  2. phaser源码解析(三) Phaser.Utils类下isPlainObject方法

    /** * #这是一个对jQuery.isPlainObject(obj)稍加修改的方法. 一个 普通对象 obj.toString() => "[object Object]&quo ...

  3. MyEclipse 多项目对应配置多个Tomcat

    在MyEclipse的安装目录下,有D:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins 的插件路径. 里边很多插件的配置文件包.   找到 ...

  4. ECHO is off

    执行 batch 脚本: @ECHO OFF @ECHO @ECHO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Alert !!!!!!!!!!!!!!!!!!!!!!! ...

  5. ECMA5.1中关于encodeURI,decodeURI 和encodeComponentURI,decodeComponentURI的区别

    The encodeURI and decodeURI functions are intended to work with complete URIs; theyassume that any r ...

  6. 2015-01-27-从实验出发理解buffer与cache区别-吴伟顺

        通过du(find) 与 cat 体现buffer与cache差异实验: 实验表明: 1 通常 buffer << cache 2 "文件系统"相关内容(ino ...

  7. php安装过程中遇到的需要安装的问题

    http://www.cnblogs.com/kristain/articles/3809243.html     借鉴php安装错误 2013-01-04 19:16:49 分类: 系统运维 环境: ...

  8. IE 动态绑定click事件

    //必须先清除原有的事件 $(dom).attr("onclick", ""); //再重新绑定新的事件 $(dom).bind("click&quo ...

  9. BOM 子对象,history,location,screen

    history:包括浏览器访问过的 url 属性:返回浏览器访问过的历史记录数 方法:back(); forward(); go(number) location:包含当前 url 的相关信息 属性: ...

  10. web2.0最全的国外API应用集合

    web2.0最全的国外API应用集合 原文地址:http://www.buguat.com/post/98.html 2.0时代,越来越多的API被大家广泛应用,如果你还不了解API是何物,请看这里的 ...