模块,组件,头在CLR(Modules, Assemblies, Headers in CLR)

2019-09-16 09:59发布

我一直在阅读CLR与C#3.0和我一直在组件,模块和接头反映然而,事情变得复杂。 这是我的理解,但如果将是巨大的,如果有人可以澄清的东西多一点:

  1. 模块是包含IL代码和元数据的表的CSC.EXE结果。 元数据表包含三种不同的表格:

    • 定义表,如 “ModuleDef,类型定义,PropertyDef,MethodDef,EventDef,FieldDef”
    • 参考表,例如 “TypeRef,ModuleRef,MemberRef等。”
    • 清单表**
  2. 组件是含有许多模块以及资源诸如图像,文档,PDF等的容器

  3. 这代表了可移植可执行PE文件的文件可以是.exe或.dll。 这些文件PE32或PE32 +头,CLR头,元数据,IL代码。

这些书说,议会是一个容器由模块组成的,它也说,托管模块是

管理模块:

被管理模块是一个标准的32位的Microsoft Windows可移植可执行(PE32)文件或需要的CLR以执行一个标准的64位的Windows可移植可执行(PE32 +)文件。

里希特,杰弗里(2010-02-05)。 通过C#(点燃位置696-697)CLR。 欧莱礼 - A. Kindle版。

大会的定义:

的组件是一个或多个模块或资源文件的逻辑分组。

里希特,杰弗里(2010-02-05)。 通过C#(点燃位置766-767)CLR。 欧莱礼 - A. Kindle版。

如此看来,托管模块实际上是来自同一本书拍摄的图像在大会的一部分。

PE32头属于组件,但是笔者还表示,它属于管理模块以及等

什么是这里的分离? 他为什么要使用模块和组件可互换甚至认为他们看起来不够独立。

被管理PE文件有四个主要部分:PE32(+)报头,该CLR头,元数据,和IL。 的PE32(+)头是,Windows期望标准信息。 的CLR头是信息的小块是特定于所需要的CLR(管理模块)模块。

里希特,杰弗里(2010-02-05)。 通过C#(点燃位置1628至1629年)CLR。 欧莱礼 - A. Kindle版。

也清楚的图像显示模块只有没有元数据PE32(+),CLR头,等你觉得清单和元数据可以互换使用?

而且还可以请你解释**清单表中的模块呢?

Answer 1:

什么你贴有点害羞的托管程序究竟是如何嵌入在PE32文件。 这是一个非常灵活的格式,原本用来存储本地可执行代码和资源,但足够的灵活性,还可以存储数据。 这实在是一个组件能够从视图窗口的点是什么。 只有CLR可以将这些数据转化为可执行的东西。

一个PE32文件包含的不仅仅是该组件的详细。 这里面实际上是原生代码。 5个字节的它为纯管理组件。 它有一个跳转指令到mscoree.dll中,引导程序托管代码。 一个EXE包含跳转到_CorExeMain,一个DLL包含跳转到_CorDllMain。 这被进一步扩展为混合模式组件,System.Data.dll中和PresentationCore.dll中那些的实例。 他们在他们的本机代码,这是由托管类包装的大量代码。 在C ++ / CLI编译器和链接器是建立这样的组件的方式。 .text段包含的代码,使用.reloc包含重定位信息,有助于在内存中的任意地址得到加载的DLL。

大多数PE32文件还包含非托管资源。 该Windows识别的格式。 这是存储在.rsrc节。 C#编译器,例如自动创建资源存在,有些东西你可以用/ win32res选项覆盖。 您可以使用文件+打开+文件看到这一点,选择装配。 有三个重要的:

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

DUMPBIN.EXE是在PE32文件的内部偷看的工具。 不幸的是,知道管理组件,所以你不能看到的一切。



Answer 2:

里希特的书是伟大的,但“真理”的定义ECMA CLI标准。
请根据官方标准定义查询第5章“术语和定义”。
我想你会了解不同的术语之间的共同点和不同点最好的时候,只是在看那里的定义。



文章来源: Modules, Assemblies, Headers in CLR