转: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. C#学习笔记(4)

    今天先把上几个系列的做一个总结,在这里给出一个面向对象版的简易计算器(重在理解面向对象的思想). 1.首先定义一个计算器类(类库)(Calculator) public abstract class ...

  2. iOS多线程--NSOperation

    NSOperation是基于GCD的一套多线程实现方案,和GCD一样,线程的生命周期是由系统来自动管理的,不用像NSThread和Pthread一样让程序员手动管理.相对于GCD来说,它更加地面向对象 ...

  3. 例子: 自制Flask首页导航.

    # -*- coding:utf-8 -*- ''' Created on 2015年10月19日 ''' from flask import Flask, render_template impor ...

  4. 【培训】交换机VLAN

    为了解决用交换机做LAN互联无法限制广播的问题,出现了VLAN技术,把一个LAN划分为多个逻辑的“LAN”-VLAN. VLAN技术将一个物理的LAN逻辑地划分为不同的广播域,每一个VLAN包含一组有 ...

  5. Cogs 1008. 贪婪大陆(树状数组)

    贪婪大陆 难度等级 ★★ 时间限制 1000 ms (1 s) 内存限制 128 MB 测试数据 10 简单对比 输入文件:greedisland.in 输出文件:greedisland.out 简单 ...

  6. OpenGL中的深度、深度缓存、深度测试及保存成图片

    1.深度 所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离.摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机. 2.深度缓冲区 深度缓冲区原理就 ...

  7. VS2010修改默认配置路径

    视图->属性管理器 弹出如下截图:

  8. C语言库函数--操作文件

    //C库函数读取文件的代码 I/O缓冲机制 C语言库函数写文件都是写在内存中,然后一次写入磁盘.提高了效率. 读写文件,不对系统进行操作,一般采用C语言库函数.移植可以在任何可以对C支持的操作系统,而 ...

  9. bootstrap Tooltip换行问题

    bootstrap自身带有tooltip,使用起来很方便,但是美中不足,它的tooltip并不支持换行. 比如我们通过<textarea>输入框传入到数据库的长文本,文本是带有换行符的,但 ...

  10. php Static静态关键字

    静态属性与方法可以在不实例化类的情况下调用,直接使用类名::方法名的方式进行调用.静态属性不允许对象使用->操作符调用. class Car { private static $speed =  ...