转: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. 理解RunLoop

    一.什么是RunLoop? 从字面意思上来看,RunLoop就是运行循环,跑圈的意思. 我们都知道,一般来说一个线程执行一次任务之后便会退出,在iOS中,如果主线程只执行一次便退出的话也就意味着程序的 ...

  2. AngularJS2学习

    @Input @Input是用来定义模块的输入的,用来让父模块往子模块传递内容: @Component({ selector: 'bank-account', template: ` Bank Nam ...

  3. linux管理网络连接指令

    ethtool eth0  查看 eth0对应网卡的设置 ethtool -i eth0 查看 eth0网卡的驱动信息 ethtool -S eth0 查看网卡的统计信息 ethtool -s eth ...

  4. (转)IOS学习笔记-2015-03-29 int、long、long long取值范围

    unsigned - - unsigned - - unsigned __int64的最大值: __int64的最小值:- unsigned __int64的最大值:  

  5. IIS配置及防黑

    安装IIS.部署网站(发布或者拷贝都可以).修改连接字符串,compilation设为false,删掉cs代码 上传文件夹不给执行权限: 在iis管理器中找到上传文件夹,选择属性--执行权限,设置为“ ...

  6. AJAX 一些常用方法

    abort() 停止当前请求getAllResponseHeaders() 返回包含HTTP请求的所有响应头信息,其中响应头包括Content-Length,Date,URI等内容.getRespon ...

  7. Spring---Web MVC关于前台传值转换问题

    Cannot convert value of type [java.lang.String] to required type [java.util.List]. 问题在于:(String to E ...

  8. important的妙用

    !important: 为某些样式设置具有最高权值,高于id选择器 用法: !important要写在分号的前面 例如: <p class="first">!impor ...

  9. ci 用本身 email 类发 email

    //比如 在控制器用 email 方法发送邮件 //用126的smtp 发送,示例邮件为 myemail@126.com 密码为 password public function email() { ...

  10. 基于IAccessible接口的QQ窗口信息获取的实现

    这个技术现在已经封装成DLL免费开放给大家使用了,详情请加群221487171 可以访问官方网站下载 http://www.guihelper.com/ 主要技术(Microsoft Active A ...