程序集不仅仅是用于打包可执行代码的一种逻辑方法,更为重要的是,它正是.NET模型中完成代码部署、版本控制和安全的核心:
所有托管代码,无论它是一个独立的程序,还是一个控件,或者是一个包含可重用类型的DLL库,都将打包到一个程序集中。程序集是可在系统上部署的最基本的原子单位。开始运行应用时,只有初始化所需的那些程序集必须加载,其他程序集在需要时才加载。聪明的开发人员能够充分利用这个性质,即根据程序集使用的频率来划分程序集。
在.NET术语中,一个程序集就构成一个版本边界(version boundary)。清单中的版本字段会应用于程序集中的所有类型和资源。因此,构成程序集的所有文件都要视为同一版本的一个整体。由于物理包不与逻辑耦合,所以.NET中多个物理文件可以共享一个逻辑属性,而基于传统DLL的系统做不到这一点,这也是区分程序集和传统DLL系统的基本特征。
程序集也可以构成决定访问许可的一个安全边界(security boundary)。C#使用访问修饰符来控制如何访问程序集中的类型和类型成员。其中两个修饰符就使用了程序集作为边界:public允许从任何程序集访问而不受限制;internal则限制只能在程序集内部访问类型和成员。
如前所述,一个程序集中可以包含多个文件。这些文件不仅可以是代码模块,也可以是诸如图形图像、文本文件之类的资源文件。这些资源文件的一个常见用途是,可以根据用户所在国家或所使用的语言定制资源从而提供应用的界面。程序集中包含的文件个数没有限制,图1ˉ6显示了一个多文件程序集(包含多个文件)的布局。
在图1ˉ6中,需要注意,程序集清单中包含了标识程序集中所有文件的信息。
虽然大多数程序集都只有一个文件,但在很多情况下,使用多文件程序集有很多好处:
不同编程语言创建的模块可以结合起来。一个编程小组可能用Visual Basic.NET完成快速应用开发(Rapid Application Development,RAD),而采用C#实现组件或企业开发。在.NET程序集中这两种代码可以并存,并且可以实现交互。
代码模块可以进行适当的划分,以优化CLR的代码加载过程,相关的、经常使用的代码应该放在一个模块中,不常使用的代码放在另外的模块中。CLR只在需要的时候才加载相应模块。如果要创建一个类库,还可以更进一步,根据共同的生命周期、版本、安全需求等方面,将组件分组到不同的程序集中。
资源文件可以放在它们自己的模块中,而不是置于IL模块。这样多个应用就能更容易地共享通用资源。
可以通过在命令行方式下运行C#编译器,或者使用程序集链接工具Al.exe来创建多文件程序集。本章最后一节将通过例子来介绍如何使用C#编译器。需要说明的是,Visual Studio.NET2005不支持创建多文件程序集。
【责任编辑:
雪花 TEL:(010)68476606-8007】