程序集内容
通常,静态程序集可能由以下四个元素组成:
- 程序集清单,包含程序集元数据。
- 类型元数据。
- 实现这些类型的 Microsoft 中间语言 (MSIL) 代码。
- 资源集。
只有程序集清单是必需的,类型或资源向程序集提供任何有意义的功能。
程序集中的这些元素有两种划分方法。可以将所有元素放在单个物理文件中。或将一个元素包含在几个文件中。这些文件可能是编译代码的模块 (.netmodule)、资源(例如 .bmp 或 .jpg 文件)或应用程序所需的其他文件。在您希望组合以不同语言编写的模块,并优化应用程序的加载过程时,可创建一个多文件程序
集,优化加载过程的方法是将很少使用的类型放在只需要时才加载的模块中。如下图所示。
上图左,开发人员将一些实用工具代码单独放入另一个模块中,同时在其原文件中保留一个较大的资源文件(在此例中为一个 .bmp 图像)。.NET 框架只在文件被引用时加载该文件;通过将很少引用的代码保留在独立于应用程序的文件中来优化代码加载。
说明:构成多文件程序集的那些文件实际上并非由文件系统来链接,而是通过程序集清单进行链接,公共语言运行库将这些文件作为一个单元来管理。
上图右,所有三个文件均属于一个程序集,如 MyAssembly.dll 所包含的程序集清单文件中所述。对于该文件系统,这三个文件是三个独立的文件。请注意,文件 Util.netmodule 被编译为一个模块,因为它不包含任何程序集信息。在创建程序集后,该程序集清单被添加到 MyAssembly.dll,指示程序集与 Util.net
模块和 Graphic.bmp 的关系。
程序集清单
每一程序集,无论是静态的,还是动态的,均包含描述该程序集中各元素之间如何关联的数据集合。程序集清单包含指定该程序集的版本要求和安全标识所需的所有元数据,以及定义该程序集的范围和解析对资源和类的引用所需的全部元数据。程序集清单可以存储在具有 Microsoft 中间语言 (MSIL) 代码的 PE 文件(.exe 或 .dll)中,也可存储在只包含程序集清单信息的独立 PE 文件中。
以下插图显示了清单的不同存储方法。
对于只有一个关联文件的程序集,该清单将被合并到 PE 文件中以构成单文件程序集。也可以创建独立的清单文件,或清单被合并到同一多文件程序集中某一 PE 文件的多文件程序集。
每一程序集的清单均执行以下功能:
- 枚举构成该程序集的文件。
- 控制对该程序集的类型和资源的引用如何映射到包含其声明和实现的文件。
- 枚举该程序集所依赖的其他程序集。
- 在程序集的使用者和程序集实现详细信息的使用者之间提供一定程度的间接性。
- 呈现程序集自述。
下表显示了在程序集清单中包含的信息。前四项(程序集名称、版本号、区域性和强名称信息)构成了程序集的标识。
信息 | 说明 |
程序集名称 | 指定程序集名称的文本字符串。 |
版本号 | 主版本号和次版本号,以及修订号和内部版本号。公共语言运行库使用这些编号来强制实施版本策略。 |
区域性 | 有关该程序集支持的区域性或语言的信息。此信息只应用于将一个程序集指定为包含特定区域性或特定语言信息的附属程序集。(具有区域性信息的程序集被自动假定为附属程序集。) |
强名称信息 | 如果已经为程序集提供了一个强名称,则为来自发行者的公钥。 |
程序集中所有文件的列表 | 在程序集中包含的每一文件的散列及文件名。请注意,构成程序集的所有文件所在的目录必须是包含该程序集清单的文件所在的目录。 |
类型引用信息 | 运行库用来将类型引用映射到包含其声明和实现文件的信息。该信息用于从程序集导出的类型。 |
有关被引用程序集的信息 | 该程序集静态引用其他程序集的列表。如果依赖的程序集具有强名称,则每一引用均包括该依赖程序集的名称、程序集元数据(版本、区域性、操作系统等)和公钥。 |
通过在代码中使用程序集属性,您可以添加或更改程序集清单中的一些信息,如更改版本信息和信息性属性,包括商标、版权、产品、公司和信息性版本。
参考
http://msdn.microsoft.com/zh-cn/library/zst29sk2(v=VS.90).aspx
http://msdn.microsoft.com/zh-cn/library/1w45z383(v=VS.90).aspx