代码改变世界

1.2 将托管模块合并成程序集

2011-11-02 14:11  iRead  阅读(399)  评论(1编辑  收藏  举报

  CLR 实际不和模块一起工作。 相反,它是程序集的实际不和模块一起工作。程序集 (assembly assemblyassembly assembly )是一个抽象的概念,初学者往很难把握它的精髓。首先,程序集是一个或多模块/资源文件的逻辑性分组。其次,程序集是 资源文件的逻辑性分组。其次,程序集是重用、安全性以及版本控制的最小单元。取决于你对编译器或工具选择, 既可生成文件程序集。在 CLR的世界中,程序集相当于一个“组件”。

  第 2章会深入探讨程序 集。所以,这里不准备在它上面花费太多的笔墨。只想提醒一句:利用“程序集”这种概念性的东西,可以将一组文件当作个单独实体来对待。

  图 1-2有助于理解程序集。 在这幅图中,一些托管模块和资源(或数据)文件准备交由一个工具处理。该工具生成单独一个PE32(+)文件来表示文件的逻辑性分组。实际发生的事情是,这个PE(+)文件包含了一个名为“清单”(manifest)的数据块。清单是由元数据表构成的另一种集合。这些表描述了构成程序集的文件,由程序集中的文件实现的公开导出的类型,以及与程序集关联在一起的资源或者数据文件。 

  

图1-2 将托管模块合并成程序集

  对于一个可重用、可保护的、可版本控制的组件,程序集把它的逻辑表示和物理表示区分开。具体如何将代码和资源划分到不同的文件中,这完全取决于个人。例如,可以将很少用到的类型和资源放到单独的文件中,并将这些文件作为程序集的一部分。取决于运行时的需要,可从网上下载这些当度的文件。如果文件永远用不上,则永远不会下载。这样不仅节省磁盘空间,还缩短了安装时间。利用程序集,可以在不同的地方部署文件,同时仍然将所有文件作为一个整体来对待。

  在程序集的模块中,还包含与引用的程序集有关的信息(包含它们的版本号)。这些信息使程序集能够自描述(self-describing)。换言之,CLR能判断出为了执行程序集中的代码,程序集的直接依赖对象(immediate dependency)是什么。不需要在注册表或Active Directory Domain Service(ADDS)中保存额外的信息。由于无需额外信息,所以相较于非托管组件,程序集部署起来容易得多。

  返回目录页


  注解:

  所谓公开导出的类型,就是程序集中定义的public类型,它们在程序集的外部可见。