模块定义

CLR程序存在模块(module)中.一个CLR模块是一个字节流,通常作为一个文件存储在本地的文件系统中或者Web服务器上

CLR模块采用Windows NT的PE/COFF可执行文件格式的扩展版.

PE:Portable Execute,可移植可执行文件.COFF:Common Object File Format,公共对象文件格式.当CLR编译器对C#,VB.NET等源程序编译后,产生MSIL(中间语言)和元数据.元数据描述代码中的类型,包括每种类型的定义,每种类型的成员的签名,代码引用的成员和运行库在执行时使用的其他数据.MSIL和元数据包含在一个PE文件中,此文件基于并扩展过去用于可执行内容的已公布的Microsoft PE和COFF.这种文件格式包含MSIL或本机代码以及元数据,使得操作系统能够识别公共语言运行库映像.文件中的元数据以及MSIL的存在使得代码能够描述自身,这意味着不再需要类型库或接口定义语言(IDL).

CLR模块包含代码,元数据和资源.

C#编译器(CSC.EXE),VB.NET编译器(VBC.EXE)和C++编译器(CL.EXE)都能够将源代码翻译成CLR模块.

程序集定义

为了部署CLR模块,开发人员首先必须将其归属于一个程序集(assembly)中.程序集就是一个或多个模块的逻辑集合.如前面讨论过的那样,模块是以字节流形式存在的物理构件,通常存放在文件系统中.程序集是逻辑构件.并且通过独立于位置的名字进行引用.而这个名字必须翻译为文件系统中或Internet上的物理路径.那些物理路径最终指向一个或多个包含类型定义,代码以及资源的模块.

CLR允许开发人员用多个模块组建程序集,主要是为了支持将那些不经常访问的代码的加载区分开来,同时不用为他们形成单独的封装边界.这个特征在开发人员采用代码下载时特别有用,因为他们可以先只下载初始模块,然后根据需求再下载下一个模块.多模块程序集还可以是混合语言的.

尽管程序集可能由多个模块组成,但是一个模块往往只属于一个程序集.假如出现两个程序集都引用同一个公共模块的情况,将作如何处理?这时,CLR将这个公共模块视为两个不同的模块,即公共模块中的每个类型都有两个不同的拷贝.

在CLR中,程序集是部署的"原子",被用来对CLR模块进行打包,加载,分发以及版本控制.虽然程序集可能包括多个模块以及辅助文件,但程序集本身被作为原子单位进行命名和版本化.如果程序集的某个模块版本发生变化,那么,整个程序集都必须重新部署,因为版本号是程序集名字的一部分,而不是底层模块名字的一部分.

模块一般都依赖于来自其他程序集的类型.最起码每个模块都依赖于定义在mscorlib程序集中的类型,例如,System.Object和System.String等等.每个CLR模块都包含一个程序集名字的列表,指明该模块所使用的程序集.对于这些程序集以外的引用,它们只是使用了程序集的逻辑名字,而不包含底层模块名或者位置信息.CLR负责在运行时将这些程序集的逻辑名字转换为模块的路径名.

为了促使CLR能够找到程序集中的不同部分,每个程序集都正好有一个模块,其元数据包含了程序集清单(assembly manifest).程序集清单是CLR元数据中附加的一部分,相当于附加的类型定义和代码的附属文件目录.CLR能够直接加载包含程序集清单的模块.对于没有程序集清单的模块,CLR只能间接地加载它们.CLR首先要加载含有程序集清单的模块,而这个模块的清单必须引用这些没有清单的模块.注意,4个/t编译选项中,只有/t:module产生没有程序集清单的模块.

程序集形成一个封装边界(encapsulation boundary),在程序集之间的访问保护内部实现细节.将类型成员标注为internal,将导致它只对同一程序集的模块是可用的.假如将类型成员标注为public,则导致它对所有代码(当前程序集内部和外部的)都是可用的.

程序集名字

每个程序集都采用四部分(four-part)名字,作为唯一的标识.这四部分名字由名称,文化,开发人员以及组件版本构成.这些名字被存放于程序集自身的程序集清单(assembly manifest)中,以及引用它的所有程序集的程序集清单中.在加载时,CLR使用四部程序集名字找到正确的组件.CLR提供的System.Reflection.AssemblyName类型,便于开发人员通过编程对程序集名字进行访问,具体则是调用该类型的System.Reflection.Assembly.GetName方法.

公钥和程序集

CLR加载器

CLR加载器负责加载和初始化程序集,模块,资源以及类型.CLR加载器总是尽可能少地加载和初始化.与Win32加载器不同,CLR加载器不会处理与自动加载从属模块(或者程序集).准确地说,从属部分只有当它们确实被需要时才会按需加载.

将名字解析成位置

版本化的问题

.NET本质论 组件的更多相关文章

  1. C++ 类的动态组件化技术

    序言: N年前,我们曾在软件开发上出现了这样的困惑,用VC开发COM组件过于复杂,用VB开发COM组件发现效率低,而且不能实现面向对象的很多特性,例如,继承,多态等.更况且如何快速封装利用历史遗留的大 ...

  2. 《COM本质论》COM是一个更好的C++心得分享

    昨天看了<COM本质论>的第一章"COM是一个更好的C++",认为非常有必要做一些笔记,于是整理成这篇文章.我相信你值得拥有. 这篇文章主要讲的内容是:一个实现了高速查 ...

  3. 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)

    来自:http://blog.csdn.net/zhdwjie/article/details/1490741 -------------------------------------------- ...

  4. ExtJS 4.2 评分组件

    上一文章是扩展ExtJS自带的Date组件.在这里将创建一个评分组件. 目录 1. 介绍 2. 示例 3. 资源下载 1. 介绍 代码参考的是 Sencha Touch 2上的一个RatingStar ...

  5. react组件的生命周期

    写在前面: 阅读了多遍文章之后,自己总结了一个.一遍加强记忆,和日后回顾. 一.实例化(初始化) var Button = React.createClass({ getInitialState: f ...

  6. react-router 组件式配置与对象式配置小区别

    1. react-router 对象式配置 和 组件式配置    组件式配置(Redirect) ----对应---- 对象式配置(onEnter钩子) IndexRedirect -----对应-- ...

  7. Angular2入门系列教程3-多个组件,主从关系

    上一篇 Angular2项目初体验-编写自己的第一个组件 好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系 现在,假设我们要做 ...

  8. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  9. .NET Core 首例 Office 开源跨平台组件(NPOI Core)

    前言 最近项目中,需要使用到 Excel 导出,找了一圈发现没有适用于 .NET Core的,不依赖Office和操作系统限制的 Office 组件,于是萌生了把 NPOI 适配并移植到 .NET C ...

随机推荐

  1. Remove duplicates from array

    //Given a sorted array, remove the duplicates in place such that each element appear only // once an ...

  2. L1-055 谁是赢家

    某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定.规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出:或艺人的观 ...

  3. hdu 5228 OO’s Sequence(单独取数算贡献)

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  4. MVC4.0实现批量删除

    HTML: @using(Html.BeginForm("Delete","Home")){    <div>    <input type= ...

  5. sql server 2012的AlwaysOn高可用

    一.Alway On高性能组件配置说明: 服务器集群节点:2 服务器的操作系统:windows 2008 Sql server版本:sql server 2012 此配置省略sql server的安装 ...

  6. jq 全选与联动的小例子

    function initcheckbox () { $(".j-jobs-power dl dt input").click(function () { if (this.che ...

  7. 64-65管道,rm与rmdir

    听说linux根目录tmp文件夹内是临时文件.用久了会产生很多垃圾文件 请问下面的临时文件怎么维护清理?全部没用删除,还是? /tmp 公用的临时文件存储点 linux下的文件结构 /bin 二进制可 ...

  8. HDU 6050 17多校2 Funny Function(数学+乘法逆元)

    Problem Description Function Fx,ysatisfies:For given integers N and M,calculate Fm,1 modulo 1e9+7.   ...

  9. httpd: config error '*.php:/usr/bin/php-cgi' in '/etc/httpd.conf'

    /********************************************************************************* * httpd: config e ...

  10. [c++]base64编解码 and image

    //½«Í¼ÏñתΪbase64¸ñʽ vector<uchar> vecImg; //Mat ͼƬÊý¾Ýת»»Îªvector<uchar> vector< ...