在 .net 中,程序集和模块之间的区别在于模块
不包含清单。
//Copied from CLR via C#
什么是清单?
清单是另一组
元数据表基本上包含作为程序集一部分的文件的名称。他们也
描述程序集的版本、文化、发布者、公开导出的类型以及所有文件
组成大会。
CLR 对程序集进行操作;也就是说,CLR 总是加载包含清单的文件
首先元数据表,然后使用清单来获取程序集中的其他文件/模块的名称。
如何将模块组合成一个程序集?
使用 C# 编译器
了解如何构建多文件/多模块
汇编,假设我们有两个源代码文件:
■■ RUT.cs,其中包含很少使用的类型
■■ FUT.cs,包含常用类型
让我们将很少使用的类型编译到他们自己的模块中,这样程序集的用户就不需要
如果他们从不访问很少使用的类型,则部署此模块。
csc /t:module RUT.cs
这一行使 C# 编译器创建一个 RUT.netmodule 文件。这个文件是一个标准的 DLL PE 文件,
但是,CLR 本身无法加载它。
接下来让我们将常用的类型编译到他们自己的模块中。我们将使这个模块成为
程序集清单的管理员,因为这些类型经常使用。事实上,因为这个模块
现在将代表整个程序集,我将输出文件的名称更改为 MultiFileLibrary.dll
而不是调用它 FUT.dll。
csc /out:MultiFileLibrary.dll /t:library /addmodule:RUT.netmodule FUT.cs
这一行告诉 C# 编译器编译 FUT.cs 文件以生成 MultiFileLibrary.dll 文件。因为
/t:library 被指定,包含清单元数据表的 DLL PE 文件被发送到
MultiFileLibrary.dll 文件。 /addmodule:RUT.netmodule 开关告诉编译器 RUT.netmodule
是一个应该被视为程序集一部分的文件。具体来说,/addmodule 开关告诉
编译器将文件添加到 FileDef 清单元数据表并公开添加 RUT.netmodule
将类型导出到 ExportedTypesDef 清单元数据表。
编译器完成所有处理后,将创建图 2-1 所示的两个文件。
右侧的模块包含清单。
使用汇编链接器
AL.exe 实用程序可以生成 EXE 或 DLL PE 文件,其中仅包含描述
其他模块中的类型。要了解 AL.exe 的工作原理,让我们更改 MultiFileLibrary.dll 的方式
程序集已构建。
csc /t:module RUT.cs
csc /t:module FUT.cs
al /out: MultiFileLibrary.dll /t:library FUT.netmodule RUT.netmodule
图 2-3 显示了执行这些语句产生的文件。
我建议您阅读 CHAPTER 2: Building, Packaging, Deploying, and Administering Applications and Types from CLR via C# by Jeffrey Richter,以详细了解这个概念.