gpt4 book ai didi

.net - .NET dll 和普通 dll 之间的 `exact` 区别是什么?

转载 作者:行者123 更新时间:2023-12-03 02:11:19 25 4
gpt4 key购买 nike

我想知道 .NET dll 和普通 dll 之间的确切区别是什么。

第一个问题,“普通DLL”叫什么?我用的是“正常”这个词。但好像不太对劲?

因为两者都遵循PE格式。是的,我同意 .NET DLL 有一个额外的部分。除此之外,其他一切都是一样的。

我还知道.NET代码被转换为CIL/MSIL,那么PE文件的.text部分填充了什么?微软安全实验室?因为没有二进制代码。但是如果他们将 MSIL 放在 .text 部分中。加载程序假定它是二进制代码并允许它执行。事实并非如此。我错过了什么?

我很惊讶地知道

Even the DLL file extension is artificial. You can have DLLs with entirely different extensions—for instance .OCX controls and Control Panel applets (.CPL files) are DLLs.

DLL 文件还使用哪些扩展名?

但我可以理解使用不同扩展名的原因。为什么他们没有在 .NET DLLS 中做同样的事情呢?他们本可以使用新的扩展来将其与“普通”DLL 区分开来。他们甚至对 .NET 中的 dll 有不同的名称 (ASSEMBLY),但无法更改扩展名。嗯?

另一个完全不同的问题:什么是DLL注册?他们使用 regsvr32.exe 来实现。正确的?我在安装 Windows XP SP3 时注意到了这一点。安装后和重新启动 Windows 之前,我检查了启动列表,发现了很多带有大量 DLL 的 regsvr32.exe 条目。

请随意深入研究。我正在学习链接器、加载器、二进制格式。我也熟悉PE文件格式。

最佳答案

我从 my own post 复制并粘贴了此内容关于它:

.NET dll 的格式是:

  • PE header
  • CLR header
  • CLR 元数据
  • CLR IL 代码
  • 原生数据

PE header

PE header 是所有 Win32 应用程序和库都具有的可移植可执行 header ,它指示 Windows 如何处理该文件。对于 .NET 程序集,这会加载 CLR,而 CLR 又会加载程序集。

CLR header

这包含诸如编写 .exe 或程序集所用的 .NET 版本、任何强名称签名哈希、可以找到资源的文件中的地址(RVA 或相对虚拟地址)等信息。最重要的是应用程序的入口点,它是指向 MethodDef 元数据表或另一个文件的 token 。对于类库,此标记为 0。

CLR 元数据

这是有关存储在几种不同类型的“流”中的模块的信息。这些流通常是压缩的,#~ 除外,它可以解压缩以进行编辑并继续。流有两种形式,一种是仅用于存储的堆,另一种是表。

DLL/程序集的各个部分根据其用途存储在不同的表中 - 例如,所有类型都存储在 TypeRef 表中,所有方法都存储在 Method表。每个表都引用一个父表。

表的起点是模块表,其中仅包含模块的名称和 GUID 作为一行。之后是 ModuleRef 表,其中包含有关该模块(来自同一程序集)引用的所有模块的信息。对于 VS.NET 及其对 csc.exe 的使用,程序集中没有多个文件,只有一个模块。

之后是 TypeDef 表,其中包含 6 列,其中包含类型的名称、命名空间、其父级(0 表示接口(interface)和对象)、FieldDef 表中字段的起始行、MethodDef 表中其方法的起始行.

IL 和 native 数据

应用程序本身。

book Inside Microsoft .NET IL Assembler - Serge Lidin 如果您有兴趣,可以更详细地了解。

关于.net - .NET dll 和普通 dll 之间的 `exact` 区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2259375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com