当前位置:  开发笔记 > 小程序 > 正文

.NET dll和普通dll之间的"完全"差异是什么?

如何解决《.NETdll和普通dll之间的"完全"差异是什么?》经验,为你挑选了1个好方法。

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

第一个问题,什么是"普通DLL"?我正在使用"正常"这个词.但它似乎不对吗?

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

我也知道在.NET代码转换成CIL/MSIL然后填写PE文件的.text部分?MSIL?因为没有二进制代码.但如果他们把MSIL放在.text部分.Loader假定它是二进制代码并允许它执行.事实并非如此.我错过了什么?

我很惊讶地知道这一点

甚至DLL文件扩展名也是人为的.您可以使用具有完全不同扩展名的DLL - 例如.OCX控件和控制面板小程序(.CPL文件)是DLL.

还有哪些扩展名用于DLL文件?

但我可以理解使用不同扩展的原因.为什么他们不遵循.NET DLLS的情况?他们可以使用新的扩展来区分它与"普通"DLL.它们甚至ASSEMBLY在.NET中具有不同的dll 名称(),但无法更改扩展名.是吧?

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

请随意潜入您想要的深度.我正在学习链接器,加载器,二进制格式.我也熟悉PE文件格式.



1> Chris S..:

我已经从我自己的帖子中复制并粘贴了它:

.NET dll的格式是:

PE头

CLR标题

CLR元数据

CLR IL代码

原生数据

PE头

PE头是所有Win32应用程序和库都具有的可移植可执行头,并指示Windows如何处理该文件.使用.NET程序集,这将加载CLR,CLR又加载程序集.

CLR标题

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

CLR元数据

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

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

表的起点是Module表,它只包含模块的名称和guid作为单行.之后是ModuleRef表,其中包含有关此模块引用的所有模块的信息(来自同一程序集).在VS.NET及其使用csc.exe的情况下,程序集中没有多个文件,只有一个模块.

在此之后是TypeDef表,其中包含6个列,其中包含类型的名称,名称空间,其父项(接口和对象为0),FieldDef表中其字段的起始行,MethodDef表中其方法的起始行.

IL和本机数据

应用程序本身.

在本书中的Microsoft .NET IL汇编-塞尔Lidin如果你有兴趣进入到更多细节.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有