CLR via C# 1.2 将托管模块组合为程序集
实际上,CLR直接打交道的是程序集,而不是模块。程序集是一个抽象的概念,首先,它是一个或多个模块或资源文件的逻辑组合(即程序集由多个模块和资源文件组成)。其次,它是复用、安全、版本的最小单元。根据所选择的编译器和工具的不同,可以生成单一文件或多个文件的程序集。在CLR世界里,程序集就是我们称作组件(component)的东西。
程序集提供了一种方式,将一组文件看作一个单独的实体。
下图解释了什么是程序集。
在该图中,使用工具对托管模块和资源(或数据)文件进行处理。该工具生成了单一的PE32(+)文件,代表文件的逻辑组合。该PE32(+)文件包含一个叫做manifest的数据块。manifest是另一个元数据表的集合。这些表描述了组成程序集的文件、由这些文件所实现的公有导出类型、以及与程序集相关的资源或数据文件。
默认情况下,编译器会将产生的托管模块转换为一个程序集。也就是说,C#编译器生成的是一个包含了manifest的托管模块。其中的manifest表明程序集仅包含一个文件。对于仅包含一个托管模块且没有资源(或数据)文件的项目来说,程序集就是托管模块,并且在创建过程中,不需要执行其他操作。如果希望将一组文件组合到一个程序集之中,需要使用更多的工具(assembly linker,AL.exe)及其命令行选项。
对于一个可重用、可部署(securable)、可实施版本管理(versionable)的组件来说,程序集可以将逻辑表示和物理表示相分离(解耦)。如何将代码和资源放置于不同的文件则完全取决于我们自己。
一个程序集的模块还包含被引用的程序集的一些信息(如其版本号)。这些信息使程序集能够自描述(self-discribing)。换句话说,为了执行程序集中的代码,CLR可以确定程序集的直接依赖。(the CLR can determine the assembly’s immediate dependencies in order for code in the assembly to execute)不需要再在注册表或活动目录领域服务(Active Directory Domain Services)中获取更多的信息。由于不再需要额外的信息,因此部署程序集比部署非托管组件要容易得多。
CLR via C# 1.2 将托管模块组合为程序集