【问题标题】:Modules, Assemblies, Headers in CLRCLR 中的模块、程序集和标头
【发布时间】:2012-04-21 08:17:45
【问题描述】:

我一直在阅读 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 代码。

书上说 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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您发布的内容对于托管程序集是如何嵌入到 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 文件内部结构的工具。不幸的是,它知道托管程序集,因此您无法看到所有内容。

      【讨论】:

        猜你喜欢
        • 2014-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 2011-09-15
        • 2020-11-14
        • 2011-02-07
        相关资源
        最近更新 更多