.NET本质论 组件

模块定义

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加载器不会处理与自动加载从属模块(或者程序集).准确地说,从属部分只有当它们确实被需要时才会按需加载.

 

 

 

将名字解析成位置

 

 

 

版本化的问题

 

转载于:https://www.cnblogs.com/revoid/p/6664443.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值