我想知道.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文件格式.
我已经从我自己的帖子中复制并粘贴了它:
.NET dll的格式是:
PE头
CLR标题
CLR元数据
CLR IL代码
原生数据
PE头是所有Win32应用程序和库都具有的可移植可执行头,并指示Windows如何处理该文件.使用.NET程序集,这将加载CLR,CLR又加载程序集.
这包含诸如.NET版本.exe或程序集编写的信息,任何强名称签名哈希,文件中可以找到资源的地址(RVA或相对虚拟地址).最重要的是应用程序的入口点,它是指向MethodDef元数据表或其他文件的标记.对于类库,此标记为0.
这是有关存储在几种不同类型的"流"中的模块的信息.这些流通常是压缩的,但#〜除外,它可以解压缩进行编辑并继续.流有两种形式,一种只用于存储的堆和表.
DLL /程序集的各个部分根据它们的作用存储在不同的表中 - 例如,所有类型都存储在TypeRef
表中,表中的所有方法都存储在Method
表中.每个表都引用一个父表.
表的起点是Module表,它只包含模块的名称和guid作为单行.之后是ModuleRef表,其中包含有关此模块引用的所有模块的信息(来自同一程序集).在VS.NET及其使用csc.exe的情况下,程序集中没有多个文件,只有一个模块.
在此之后是TypeDef表,其中包含6个列,其中包含类型的名称,名称空间,其父项(接口和对象为0),FieldDef表中其字段的起始行,MethodDef表中其方法的起始行.
应用程序本身.
在本书中的Microsoft .NET IL汇编-塞尔Lidin如果你有兴趣进入到更多细节.