【发布时间】:2012-04-21 08:17:45
【问题描述】:
我一直在阅读 C# 3.0 的 CLR,我一直在思考程序集、模块和标题,但是事情变得复杂了。这是我的理解,但如果有人能再澄清一点,那就太好了:
-
模块是 csc.exe 的结果,其中包含 IL 代码和元数据表。元数据表包含三个不同的表:
- “ModuleDef、TypeDef、PropertyDef、MethodDef、EventDef、FieldDef”等定义表
- “TypeRef、ModuleRef、MemberRef 等”参考表
- 清单表**
程序集是包含许多模块以及图像、文档、pdf 等资源的容器。
- PE 文件代表 Portable Executable 文件可以是 .EXE 或 .DLL。这些文件具有 PE32 或 PE32+ 标头、CLR 标头、元数据、IL 代码。
书上说 Assembly 是一个由 Modules 组成的容器,它还说 Managed Module 是
托管模块:
托管模块是标准的 32 位 Microsoft Windows 可移植模块 可执行 (PE32) 文件或标准 64 位 Windows 便携式 需要 CLR 执行的可执行 (PE32+) 文件。
杰弗里里希特 (2010-02-05)。通过 C# 进行 CLR(Kindle 位置 696-697)。 OReilly Media - A. Kindle 版。
程序集定义:
程序集是一个或多个模块或资源的逻辑分组 文件。
杰弗里里希特 (2010-02-05)。通过 C# 的 CLR(Kindle 位置 766-767)。 OReilly Media - A. Kindle 版。
因此,从同一本书中获取的图像中,托管模块实际上是程序集的一部分。
PE32 标头属于程序集,但作者也说它也属于托管模块等。
这里的分离是什么?他为什么要使用可互换的模块和程序集,即使它们看起来足够独立。
一个托管的 PE 文件有四个主要部分:PE32(+) 标头、CLR 标头、元数据和 IL。 PE32(+) 标头是标准 Windows 期望的信息。 CLR 标头是一小块 特定于需要 CLR 的模块的信息(托管 模块)。
杰弗里里希特 (2010-02-05)。通过 C# 的 CLR(Kindle 位置 1628-1629)。 OReilly Media - A. Kindle 版。
另外图片清楚地显示Modules只有Metadata而不是PE32(+)、CLR headers等。你认为Manifest和Metadata可以互换使用吗?
您能否也解释一下模块中的 **Manifest 表?
【问题讨论】:
标签: c# .net assemblies clr