模块定义

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. VSTO杂项拾零(持续更新中……)

    环境:win 7+visual basic 2008     侧重:VSTO     界面:sheetbook工作簿 1.创建一个过程并调用(2017.6.3) Public Class Sheet1 ...

  2. datatabale 服务器分页

    转载:http://blog.csdn.net/angelvyvyan/article/details/51783272$(document).ready( function() { $('#tabl ...

  3. DevExpress WinForms v18.2新版亮点(二)

    行业领先的.NET界面控件2018年第二次重大更新——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了DevExpress WinForms v1 ...

  4. java命令提示找不到或无法加载主类

    使用java执行命令出现此错误 localhost:SocketDemo wangwei$ javac Server.java localhost:SocketDemo wangwei$ java S ...

  5. Visual Studio Code用户设置文件

    打开 settings.json 文件 修改主题 修改工作区域背景色为豆绿色 { "workbench.colorTheme": "Visual Studio Light ...

  6. React 新 Context API 在前端状态管理的实践

    本文转载至:今日头条技术博客 众所周知,React的单向数据流模式导致状态只能一级一级的由父组件传递到子组件,在大中型应用中较为繁琐不好管理,通常我们需要使用Redux来帮助我们进行管理,然而随着Re ...

  7. lvm逻辑卷扩容

    先扩容卷组在扩容逻辑卷 1.准备磁盘分区 #fdisk -l 2.查看当前的物理卷 #pvdisplay 3.准备物理卷 #pvcreate  /dev/sdb 4.查看vg #lvdisplay 5 ...

  8. 团队-团队编程项目爬取豆瓣电影top250-代码设计规范

    1.类名使用首字母大写(骆驼命名法) 2.函数名应该为小写 3.用下划线开头定义私有的属性或方法 4.命名要使用有意义的,英文单词或词组 5.行尾不加分号 6.4个空格缩进代码 7.操作运算符注意优先 ...

  9. Java学习笔记24(Map集合)

    Map接口: Map接口与Collection接口无继承关系. 区别:Collection中的元素是孤立的,一个一个存进去的. Map作为一个映射集合,每一个元素包含Key-value对(键-值对). ...

  10. 4.App测试与Web测试的不同

    注释:*蓝色为不同点,红色为测试类型* 测试工具不同 Web自动化用Selenium APP自动化用Appium 软件架构不同 App为C/S架构 Web为B/S架构 需要进行安装卸载更新测试 第一次 ...