【发布时间】:2012-04-09 15:57:00
【问题描述】:
什么是 .NET 中的托管模块,它与程序集有何不同? PE 文件(例如 test.dll)是托管模块还是程序集?汇编/托管模块如何对应磁盘上的物理文件?
【问题讨论】:
什么是 .NET 中的托管模块,它与程序集有何不同? PE 文件(例如 test.dll)是托管模块还是程序集?汇编/托管模块如何对应磁盘上的物理文件?
【问题讨论】:
托管模块一般理解为指只包含IL代码,没有直接机器代码的模块。
一个模块存放在一个普通的 PE 文件中。
程序集是一组 1 个或多个模块,其中一个被指定为“头”(将查找确切的术语 [1])。一个模块本身并没有多大用处 - 程序集是原子单元。
例如,您可以拥有一个包含 2 个 DLL 和一个 EXE 的多模块程序集。不过,多模块程序集非常少见。
Don Box 的书 Esssential .NET,Richter CLR via C# 很好地涵盖了该主题。有关完整的详细信息,Serge Lidin .NET 2.0 IL Assembler 书籍和 CLI 标准更完整。
[1] 根据http://www.programmersheaven.com/2/FAQ-DOTNET-DOTNET-Assembly-Explained
程序集可以是单个文件,也可以由多个文件组成。在多文件的情况下,有一个包含清单的主模块,而其他程序集作为非清单模块存在
回答实际问题:-
什么是 .NET 中的托管模块,它与程序集有何不同?
它是一个子集 - DLL 可以是没有子模块的主模块 - 因此也是一个程序集
PE 文件(例如 test.dll)是托管模块还是程序集?
绝对是一个模块。如果它也有一个清单并且没有子模块,它也是一个程序集
汇编/托管模块如何对应磁盘上的物理文件? 每个模块都是一个文件。 (如果您有兴趣,ILMerge 等工具可以合并模块)
【讨论】:
一个模块包含 IL 并且它们中的许多被链接在一起以创建一个程序集,该程序集通常位于像 .exe 或 .dll 这样的 PE 中。
PE 也可以包含本机(非托管)代码。
【讨论】:
托管模块是编译后的 IL 源代码的版本。这 构建的文件的扩展名 从源文件制作模块时 是.netmodule。
程序集是 DLL 或 .exe 包含托管模块的文件, 资源和元数据。
【讨论】: