程序集

       二进制重用(binary reuse)的概念是.NET平台的一个主要特点,它使得应用程序可以使用多个外部程序集(又称代码库)里面的类型。

.NET程序集的作用:.NET应用程序可以由多个程序集拼装而成。简单来说,程序集就是一个以公共语言运行库(CLR)为宿主的、版本的、自描述的二进制文件。尽管现实中.NET程序集和以往Windows二进制文件(包括遗留的COM服务器)的文件扩展名(*.exe或者*.dll)完全相同,但是两者的内部构成则几乎完全不同。

程序集是可版本化的单元:每个.NET程序集被分配一个格式为<major>.<minor>.<build>.<revision>的四部分数字版本号。(如果没有显式设置版本号,程序集会自动分配版本号1.0.0.0,即默认的Visual Studio项目设置。)版本号加上可选的公钥值使得一个程序集的不同版本在同一台机器上能够共处而不产生冲突。正是来讲,提供了公钥信息的程序集被称为强命的(strongly named)。

程序集是自描述的:程序集被认为是自描述的,部分原因是它们记录了自身正常运行所需要访问的外部程序集。因此,如果程序集需要访问System.Windows.forms.dll和System.Drawing.dll,那么它们的信息将会被记录到该程序集的清单(manifest)中。清单是一段描述程序集自身各种信息(名称、版本、需要的外部程序集等)的元数据块。

除了清单数据,程序集还包含另外一些元数据。这些元数据描述了程序集包含的每一个类型的组成(成员名称、实现的接口、基类、构造函数等)。由于程序集的信息被如此详细地记录下来,CLR并不需要访问Windows系统注册表来解析程序集的位置(这与微软原来的COM编程模型有很大的区别)。

程序集是可配置的:程序集可以以“私有”或者“公有”的方式部署。私有程序集与调用它的客户端应用程序处于同一个目录下(也可以在其子目录下)。而共享程序集则是为了让同一台机器上的大部分成用程序都可以使用它而存在的一种代码库,它被部署在全局程序集缓存(GAC)的特定目录中。

.NET程序集的格式:从结构上看,一个.NET程序集(*.exe或者*.dll)包含以下几个部分:Windows文件首部、CLR文件首部、CIL代码、类型元数据、程序集清单、可选的嵌入资源。

单文件程序集和多文件程序集:从技术的角度上说,程序集可以由多个模块组成。实际上,模块这个术语一般用于表示一个合法的.NET二进制文件。在大多数情况下,程序集只由一个模块组成。这种情况下,(逻辑)程序集和实际的(物理)二进制文件是一一对于的(因此被称作单文件程序集)。当文件程序集的所有必要部分(首部信息、CIL代码、类型元数据、清单和必需的资源)都包含在一个*.exe或者*.dll包中。另一方面,多文件程序集是.NET模块的集合,这些模块作为单个逻辑单元进行部署和版本化。通常,其中的一个会作为主模块,它将包含程序集级别的清单(以及必要的CIL代码、元数据、头信息和可选资源)。主模块的清单记录了它依赖的每一个相关模块。根据命名习惯,多文件程序集的辅助块的文件开展名一般是*.netmodule,但这不并是CLR的强制要求。辅助模块*.netmodules也包含CIL代码和类型元数据,同时还有一个模块级别的清单,该清单只记录了该模块外部的程序集。

       多文件程序集的主要优点是:提高了程序下载的效率。例如,假设有一个客户端引用了远程的一个多文件程序集(包含3个模块),其中的主模块已经安装在客户端。如果客户端需要使用远程*.netmodule中的类型的话,那么CRL将会按需要把二进制模块下载到本地的下载缓存中。如果每一个*.netmodule模块大小是5MB的话,那么好处显而易见(与下载15MB的单文件相比)。多文件程序集的另外一个优点是:允许模块有不同的.NET编程语言进行编写。无论如何,请记住组成一个多文件程序集的模块并没有相互连接成一个大文件,相反,它们只是与主模块清单中记录信息逻辑地连接在一起。

你可能感兴趣的:(编程,.net,windows,服务器,语言,cil)