CLR中的模块,程序集,标头

时间:2012-04-08 18:03:20

标签: c# .net assemblies clr

我一直在阅读使用C#3.0的CLR,我一直在思考Assemblies,Modules和Headers但事情变得复杂了。这就是我所理解的,但如果有人能够澄清一点事情,那将会很棒:

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

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

  3. 代表Portable Executable的PE文件是.EXE或.DLL文件。这些文件具有PE32或PE32 +标头,CLR标头,元数据,IL代码。
  4. 书中说大会是一个由模块组成的容器,它还说管理模块是

    管理模块:

      

    托管模块是标准的32位Microsoft Windows便携版   可执行(PE32)文件或标准的64位Windows便携式   需要CLR执行的可执行文件(PE32 +)。

         

    Richter,Jeffrey(2010-02-05)。 CLR通过C#(Kindle Locations 696-697)。   OReilly Media - A. Kindle版。

    大会的定义:

      

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

         

    Richter,Jeffrey(2010-02-05)。 CLR通过C#(Kindle Locations 766-767)。   OReilly Media - A. Kindle版。

    enter image description here

    因此,管理模块似乎实际上是从同一本书中拍摄的图像中的大会的一部分。

    PE32标题属于Assemblies,但作者也说它也属于Managed Modules等。

    这里的分离是什么?为什么他认为模块和组件可以互换,即使它们看起来足够分开。

      

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

         

    Richter,Jeffrey(2010-02-05)。 CLR通过C#(Kindle位置   1628年至1629年)。 OReilly Media - A. Kindle版。

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

    您也可以在模块中解释**清单表吗?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

您发布的内容有点不知道如何在PE32文件中嵌入托管程序集。它是一种非常灵活的格式,最初用于存储本机可执行代码和资源,但足够灵活,可以存储数据。从Windows的角度来看,这就是组件的真正含义。只有CLR才能将数据转换为可执行的数据。

PE32文件不仅包含程序集。其中也有本机代码。纯托管程序集的5个字节。它有一个mscoree.dll的跳转指令,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兼容的内容。您可以通过向项目添加Application Manifest文件来创建自己的清单。
  • ICON,包含一个被选为桌面快捷方式的默认图标的图标
  • 版本,包含非托管版本资源。在Explorer Details属性表中可见,由编译器从AssemblyInfo.cs
  • 中的程序集属性合成

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