10

我一直在用 C# 3.0 阅读 CLR,我一直在思考程序集、模块和标题,但是事情变得复杂了。这是我所理解的,但如果有人能进一步澄清一些事情,那就太好了:

  1. 模块是 csc.exe 的结果,其中包含 IL 代码和元数据表。元数据表包含三个不同的表,它们是:

    • “ModuleDef、TypeDef、PropertyDef、MethodDef、EventDef、FieldDef”等定义表
    • 参考表,例如“TypeRef、ModuleRef、MemberRef 等”。
    • 清单表**
  2. 程序集是包含许多模块以及图像、文档、pdf 等资源的容器。

  3. PE 文件代表 Portable Executable 文件可以是 .EXE 或 .DLL。这些文件具有 PE​​32 或 PE32+ 标头、CLR 标头、元数据、IL 代码。

书上说组装是一个由模块组成的容器,它还说托管模块是

托管模块:

托管模块是需要 CLR 执行的标准 32 位 Microsoft Windows 可移植可执行 (PE32) 文件或标准 64 位 Windows 可移植可执行 (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)。CLR 通过 C#(Kindle 位置 1628-1629)。OReilly Media - A. Kindle 版。

图像也清楚地显示模块只有元数据而不是 PE32(+)、CLR 标头等。你认为清单和元数据可以互换使用吗?

您能否也解释一下模块中的 **Manifest 表?

4

2 回答 2

8

Richter 的书很棒,但“真相”是在ECMA CLI 标准中定义的。
根据官方标准,请查看第 5 章“术语和定义”中的定义。
我想你只要看看那里的定义,就会最好地理解不同术语之间的共性和差异。

于 2012-04-08T18:25:57.037 回答
5

您发布的内容对于托管程序集是如何嵌入到 PE32 文件中的有点害羞。它是一种非常灵活的格式,最初旨在存储本机可执行代码和资源,但也足够灵活以存储数据。从 Windows 的角度来看,这确实是一个程序集。只有 CLR 可以将该数据转换为可执行文件。

PE32 文件包含的不仅仅是程序集。实际上也有本机代码。纯托管程序集的 5 个字节。它有一个跳转指令到 mscoree.dll,托管代码的引导程序。EXE 包含到 _CorExeMain 的跳转,DLL 包含到 _CorDllMain 的跳转。这进一步扩展了混合模式程序集,System.Data.dll 和 PresentationCore.dll 就是其中的示例。它们中有大量的本机代码,由托管类包装的代码。C++/CLI 编译器和链接器是创建这样的程序集的方法。.text 部分包含代码,.reloc 部分包含重定位信息,可帮助将 DLL 加载到内存中的任意地址。

大多数 PE32 文件还包含非托管资源。Windows 可以理解的格式。这存储在 .rsrc 部分中。例如,C# 编译器会自动在那里创建资源,您可以使用 /win32res 选项覆盖这些资源。您可以使用 File + Open + File 看到这一点并选择一个程序集。有三个重要的:

  • RT_MANIFEST,包含资源 ID 为 1 的清单。这是 Windows 需要了解 C# 程序与 UAC 兼容的内容。您可以通过将应用程序清单文件添加到项目来创建自己的清单。
  • ICON,包含一个被选为桌面快捷方式默认图标的图标
  • 版本,包含非托管版本资源。在 Explorer Details 属性表中可见,由编译器从 AssemblyInfo.cs 中的程序集属性合成

Dumpbin.exe 是一个查看 PE32 文件内部结构的工具。不幸的是,它知道托管程序集,因此您无法看到所有内容。

于 2012-04-08T18:56:07.793 回答