.NET框架程序设计--生成,打包,部署及管理应用程序与类型(2:Assembly的生成以及版本信息)
(三)将模块(.netmodule)组合成为程序集(Assembly:.exe;.dll)
程序集是包含一个或者多个类型和资源文件的集合。
程序集与模块(.netmodule)的最大区别就是其拥有一个清单.
正是程序集拥有了清单,其才可以直接与CLR打交道,CLR最先加载这些程序集,利用清单获得程序集的其他文件。
特性: ·程序集定义了可重用类型(可重用) ·程序集标识有一个版本号(可实施版本策略) ·程序集可以包含与之相关的安全信息(安全策略) |
一般我们编译小型程序的时候,会把其编译成为一个程序集,较大的程序包括了很多的文件。
多文件程序集的原因(或者说优点):
(1)我们可以把类型分开管理。
(2)根据需要向程序集中添加资源或数据文件。
(3)让程序集包含一些不同语言生成的类型。
怎样编译一个不包含清单的PE文件?
csc /target:module App1.cs
生成app1.netmodule
怎样使用.netmodule文件?
必须把它连接到一个包含清单的文件中
csc /target:library /addmodule:app1.module app2.cs
这里使用了连接,说明生成的app2.dll并不能脱离app1.netmodule,即并不是把app1.netmodule的内容add到了app2.dll文件中。
如果编译器不支持/addmodule可以使用AL.exe
(四)程序集版本信息
可以直接利用VS来编辑程序集的版本信息。
程序集包括3个版本号信息,他们的格式相同:
例如:2.5.719.2
主版本号:2
次版本号:5
生成版本号(内部版本号):719
修订版本号:2
前两个版本号组成了面向公众的版本部分.这个程序集的公众版本是2.5。
第三个版本号表示如果在一天内重新生成程序集(不管生成多少次,都作为一次对待),那么这个版本号就会增加。
第四个版本号表示一天内的每次重新生成程序集,那么这个版本号就会增加(好像无规律增加)。
通过csc这样的命令编译器或者AL.exe连接器并不会改变程序集的版本,但他们支持随编译来增加相应的版本,另外,通过VS编译的程序,其主版本号和次版本号是1.0,不会随着编译而改变,但是后两个版本号会随着编译而相应的增加,自动增加并没有什么好用途,我们应该手动设置这四个版本号。
令人遗憾的是程序集包含三个版本信息
AssemblyFileVersion
AssemblyInformationVersionAttribute
AssemblyVersion
前两者CLR既不查看也不关心。
重要的是AssemblyVersion:
这个版本存储与AssemblyDef清单中,当绑定强命名程序集的时候,该版本信息唯一标识该程序集,它所引用的所有其他程序集的AssemblyVersion会被记录在AssemblyVersion中。