模块定义
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加载器不会处理与自动加载从属模块(或者程序集).准确地说,从属部分只有当它们确实被需要时才会按需加载.
将名字解析成位置
版本化的问题