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

Tar*_*rik 9 .net c# clr assemblies

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

书中说大会是一个由模块组成的容器,它也说管理模块是

管理模块:

托管模块是标准的32位Microsoft Windows可移植可执行文件(PE32)文件或标准的64位Windows可移植可执行文件(PE32 +)文件,需要CLR才能执行.

里希特,杰弗里(2010-02-05).CLR通过C#(Kindle Locations 696-697).OReilly Media - A. Kindle版.

大会的定义:

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

里希特,杰弗里(2010-02-05).CLR通过C#(Kindle Locations 766-767).OReilly Media - A. Kindle版.

在此输入图像描述

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

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

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

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

里希特,杰弗里(2010-02-05).CLR通过C#(Kindle Locations 1628-1629).OReilly Media - A. Kindle版.

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

还有,请你解释一下模块中的清单表吗?

wei*_*mat 8

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


Han*_*ant 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 File来创建自己的清单.
  • ICON包含一个图标,该图标被选为桌面快捷方式的默认图标
  • 版本,包含非托管版本资源.在Explorer Details属性表中可见,由编译器从AssemblyInfo.cs中的程序集属性合成

Dumpbin.exe是一个查看PE32文件内部的工具.不幸的是,它知道托管程序集,所以你看不到一切.