转: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. [jquery] jQuery点滴[持续更新]

    001.查看jquery的版本. $(function(){ console.log($()); //jquery console.log($().jquery); }); 002.(new Func ...

  2. 《ext江湖》第8章继承-代码片段

    创建Animal对象 <html> <head> <title>11</title> <META HTTP-EQUIV="Content ...

  3. 09.13日记(2014年9月13日00:18:26)英语,bootstrap,阮一峰,

    我们这里只推荐一本语法书:台湾的旋元佑老师写的<文法俱乐部>(简体版名为<语法俱乐部>).这本书因为出版社倒闭而绝版,淘宝可以买到影印的版本. (1)学英语:奶爸的英语教室 资 ...

  4. Hdu 4514 湫湫系列故事——设计风景线

    湫湫系列故事--设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Total ...

  5. 暑假集训(2)第九弹 ----- Points on Cycle(hdu1700)

                                                Points on Cycle Time Limit:1000MS     Memory Limit:32768 ...

  6. 清理SQL多余登录信息

    服务器列表.登陆帐户.密码等信息都记录在 %AppData%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin (2008)%A ...

  7. 设置用户sudo -s拥有root权限

    开通普通用户的ROOT权限,上线了可以禁止用户使用root权限 修改配置文件 vi etc/sudoers 在 root    ALL=(ALL) ALL那么你就在下边再加一条配置:hjd ALL=( ...

  8. python三级菜单的实现

    一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...

  9. 【python之旅】python的基础三

    目录: 1.装饰器 2.迭代器&生成器 3.Json & pickle 数据序列化 4.软件目录结构规范  一.装饰器 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能 原 ...

  10. linux下安装php扩展redis缓存

    下载phpredis安装包 wget https://github.com/nicolasff/phpredis/tarball/master 在下载目录解压phpredis.tar.gz tar z ...