模块定义

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. C++基础知识:类的静态成员

    1.普通成员变量通过对象名能够访问public成员变量每个对象都可以有只属于自己的成员变量成员变量不能在对象之间共享 2.从命名空间的角度:类的静态成员只是类这个命名空间中的全局变量和全局函数不同之处 ...

  2. 深入理解java虚拟机---内存分配策略(十三)

    转载请注明原文地址:https://blog.csdn.net/initphp/article/details/30487407 Java内存分配策略 使用的ParNew+Serial Old收集器组 ...

  3. Intellij IDEA生成foreach或者loop 快捷键

    iter Iterate (for each..in) itin Iterate (for..in) itli Iterate over a List itar Iterate elements of ...

  4. mySql单列索引与联合索引的区别

    引自https://my.oschina.net/857359351/blog/658668 第一张表gift和索引为联合索引,如图: 第二张表gift2为单列索引,如图: 下面开始进行测试: 相同的 ...

  5. <Spark><Spark Streaming><作业分析><JobHistory>

    Intro 这篇是对一个Spark (Streaming)作业的log进行分析.用来加深对Spark application运行过程,优化空间的各种理解. Here to Start 从我这个初学者写 ...

  6. 将numpy array由浮点型转换为整型

    使用numpy中的astype()方法可以实现,示例如下: x Out[20]: array([[ 5. , 4. ], [ 4. , 4.33333333], [ 3.66666667, 4.5 ] ...

  7. 你知道怎么用Idea抽取方法、创建class吗?

    liJ IDEA的快捷键是进行重构的利器,坊间盛传,完全使用IDEA快捷键重构的代码,是不需要写测试用例保护的 本文就分享一个使用IDEA抽取方法及创建新的class的方法 工具/原料   Intel ...

  8. 搭建VUE项目

    1.换源由于npm源服务器在国内访问速度较慢,所以一般需要更换源服务器地址npm config set registry https://registry.npm.taobao.org也可以安装cnp ...

  9. php防止sql注入的方法(转)

    [一.在服务器端配置] 安全,PHP代码编写是一方面,PHP的配置更是非常关键. 我们php手手工安装的,php的默认配置文件在 /usr/local/apache2/conf/php.ini,我们最 ...

  10. MySQL中的修改表操作

    一.增加表的列 语法:alter table 表名 add(           增加列定义          ); 实例: #增加列 alter table text add( text_num ) ...