[英]Modules, Assemblies, Headers in CLR
我一直在阅读 C# 3.0 的 CLR,我一直在思考程序集、模块和标头,但是事情变得复杂了。 这就是我的理解,但如果有人能稍微澄清一下就更好了:
模块是包含 IL 代码和 Metadata.tables 的 csc.exe 的结果。 Metadata.tables 包含三个不同的表,它们是:
程序集是包含许多模块以及图像、文档、pdf 等资源的容器。
书中说 Assembly 是一个由 Modules 组成的容器,它还说 Managed Module 是
托管模块:
托管模块是需要 CLR 执行的标准 32 位 Microsoft Windows 可移植可执行 (PE32) 文件或标准 64 位 Windows 可移植可执行 (PE32+) 文件。
杰弗里里希特 (2010-02-05)。 CLR 通过 C#(Kindle 位置 696-697)。 OReilly Media - A. Kindle 版。
大会的定义:
程序集是一个或多个模块或资源文件的逻辑分组。
杰弗里里希特 (2010-02-05)。 CLR 通过 C#(Kindle 位置 766-767)。 OReilly Media - A. Kindle 版。
因此,托管模块似乎实际上是从同一本书中获取的图像中的程序集的一部分。
PE32 headers 属于 Assemblies,但是作者也说它也属于 Managed Modules,等等。
这里有什么区别? 为什么他使用 Module 和 Assemblies 可互换,即使它们看起来足够独立。
托管 PE 文件有四个主要部分:PE32(+) header、CLR header、元数据和 IL。 PE32(+) header 是 Windows 期望的标准信息。 CLR header 是一小块信息,特定于需要 CLR 的模块(托管模块)。
杰弗里里希特 (2010-02-05)。 CLR 通过 C#(Kindle 位置 1628-1629)。 OReilly Media - A. Kindle 版。
该图还清楚地表明,模块只有元数据,没有 PE32(+)、CLR 标头等。您认为清单和元数据可以互换使用吗?
另外,您能否也解释一下模块中的 **Manifest 表?
Richter 的书很棒,但“真相”是在ECMA CLI 标准中定义的。
根据官方标准定义请查看第5章“术语和定义”。
我认为只要查看那里的定义,您就会最好地理解不同术语之间的共性和差异。
您发布的内容对于托管程序集是如何嵌入到 PE32 文件中有点害羞。 它是一种非常灵活的格式,最初旨在存储本机可执行代码和资源,但也足够灵活以存储数据。 从 Windows 的角度来看,这实际上就是程序集。只有 CLR 才能将该数据转换为可执行文件。
PE32 文件不仅仅包含程序集。 实际上也有本地代码。 5 个字节用于纯托管程序集。 它有一个跳转到 mscoree.dll 的指令,这是托管代码的引导程序。 EXE 包含到 _CorExeMain 的跳转,DLL 包含到 _CorDllMain 的跳转。 这进一步扩展为混合模式程序集,System.Data.dll 和 PresentationCore.dll 就是其中的示例。 它们中有大量本机代码,这些代码由托管类包装。 C++/CLI 编译器和 linker 是创建这样的程序集的方法。 .text 部分包含代码,.reloc 部分包含重定位信息,可帮助将 DLL 加载到 memory 中的任意地址。
大多数 PE32 文件还包含非托管资源。 Windows 理解的格式。 它存储在 .rsrc 部分。 例如,C# 编译器会自动在那里创建资源,您可以使用 /win32res 选项覆盖这些资源。 您可以使用 File + Open + File 和 select 程序集来查看。 重要的有以下三个:
Dumpbin.exe 是一种查看 PE32 文件内部结构的工具。 不幸的是,它了解托管程序集,因此您无法看到所有内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.