装配件由描述它的元数据,描述导出类和方法的类元数据,MSIL代码和资源组成.这些部分都在一个文件中或颁布在几个文件中.
在Componet.dll中,装配件的元数据,类的元数据,MSIL代码和资源都在一个文件中,如果下表.
Componet.dll | ||||
|
装配件的清单:
装配件的一个重要部分是装配件清单,它是元数据的一部分描述了装配件和引用它所需要的所有信息,清单由以下部分组成:
- 标识名,版本,文化和公共密钥.
- 发球该装配件的一个文件列表.一个装配件至少要有一个文件,但可以包含许多个文件.
- 引用装配件的列表.在包含了版本号和公共密钥的装配件中使用的所有装配件都在装配年清单中进行了说明.
- 一组许可请求-------运行这个装配件需要的许可.
- 导出的类不是装配件的一部分,除非这些类放在一个模块中.模块是重复使用的一个单元.类的描述与元数据一样存储在装配件中,使用属性和方法可以从这些元数据中获得结构和类,它替代了以前用COM描述类的类库.使用COM客户机,很容易在装配件清单的外部生成一个类库.反射机制使用导出类的信息,对类进行后期绑定.
- 名称空间与装配件:名称空间完全独立于装配件.三个装配件中可以有不同的名称空间,一个名称空间也可以分布在多个装配件中.名称空间只是类名的一种扩展,它属于类名的范畴.
私有装配件与共享装配件:
装配件可以是共享的也可以是私有的.私有装配件位于与应用程序所在的相同目录下,或其子目录中.使用私有装配件时,不需要考虑与其他类的命名冲突或版本冲突问题.在构建进程时,引用的装配件会复制到应用程序的目录下.私有装配件是装配件的一般方式,特别是应用程序和组件内置于同一个公司时,就更是如此了.
在共享装配件时,必须遵循一些规则.装配件必须是惟一的,因此,必须有一个惟一的名称.该名称的一部分是一个强制的版本号.当组件由另一个开发商建立,而不是应用程序的开发商建立时,以及一个大应用程序分布在几个小工程中时,常常需要使用共享装配件.
查看装配件:
装配件可以使用命令行工具ILDASM来查看,这是一个MSIL disassembler.在命令行上运行 ildasm,把装配件作为其参数,或者选择File/Open菜单, 就可以打开装配件.
建立装配件:
在VS.NET中,所有的C#工程类型都会创建一个装配件,无论是均摊DLL,还是EXE工程类型,都会创建一个装配件.使用命令C#编译器csc,也可以创建模块.模块是一个没有装配件特性的DLL.但可以在以后添加到装配件中.
csc/target:module hello.cs
创建一个模块hello.netmodule,使用ildasm可以查看这个模块.
csc/target:library hello.cs
创建一个hello.dll.
也可以把生成的模块加进去:
csc/target:library/addmodule:hello.netmodule/out:Hello.dll
这样就把刚才生成的模块加进了现在的装配件中了.
使用VS.NET创建装配件
VS.NET中所有工程类型都创建装配件.在创建一个VS.NET工程时,会生成一个源文件AssembleInfo.cs,在该文件中,可以使用一般的源代码编辑器配置装配件的属性,下面是全文:
using System.Reflection;
using System.Runtime.CompilerServices;
//
// 有关程序集的常规信息是通过下列
// 属性集控制的。更改这些属性值可修改与程序集
// 关联的信息。
//
[assembly: AssemblyTitle("")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
//
// 程序集的版本信息由下列 4 个值组成:
//
// 主版本
// 次版本
// 内部版本号
// 修订号
//
// 您可以指定所有这些值,也可以使用“修订号”和“内部版本号”的默认值,方法是按
// 如下所示使用 '*':
[assembly: AssemblyVersion("1.0.*")]
//
// 要对程序集进行签名,必须指定要使用的密钥。有关程序集签名的更多信息,请参考
// Microsoft .NET Framework 文档。
//
// 使用下面的属性控制用于签名的密钥。
//
// 注意:
// (*) 如果未指定密钥,则程序集不会被签名。
// (*) KeyName 是指已经安装在
// 计算机上的加密服务提供程序(CSP)中的密钥。KeyFile 是指包含
// 密钥的文件。
// (*) 如果 KeyFile 和 KeyName 值都已指定,则
// 发生下面的处理:
// (1) 如果在 CSP 中可以找到 KeyName,则使用该密钥。
// (2) 如果 KeyName 不存在而 KeyFile 存在,则
// KeyFile 中的密钥安装到 CSP 中并且使用该密钥。
// (*) 要创建 KeyFile,可以使用 sn.exe(强名称)实用工具。
// 在指定 KeyFile 时,KeyFile 的位置应该
// 相对于“项目输出目录”。项目输出
// 目录的位置取决于您是在使用本地项目还是 Web 项目。
// 对于本地项目,项目输出目录定义为
// <Project Directory>/obj/<Configuration>。例如,如果 KeyFile 位于该
// 项目目录中,应将 AssemblyKeyFile
// 属性指定为 [assembly: AssemblyKeyFile("..//..//mykey.snk")]
// 对于 Web 项目,项目输出目录定义为
// %HOMEPATH%/VSWebCache/<Machine Name>/<Project Directory>/obj/<Configuration>。
// (*) “延迟签名”是一个高级选项 - 有关它的更多信息,请参阅 Microsoft .NET Framework
// 文档。
//
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("")]
[assembly: AssemblyKeyName("")]
下面是System.Relection名称空间中所有的装配件属性的一个列表:
- AssemblyCompany指定公司名称.
- AssemblyConfiguration包含建立信息,例如零售或调试.
- AssemblyCopyright 和AssemblyTrademark包含版权和商标信息.
- ....