我想知道.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。它们甚至在.NET中具有不同的名称(ASSEMBLY
),但无法更改扩展名。啊?
另一个完全不同的问题:什么是DLL注册?他们使用regsvr32.exe。对?我在安装Windows XP SP3时注意到了它。安装后&在重新启动Windows之前,我检查了启动列表,发现了许多带有大量DLL的regsvr32.exe
条目。
请随意潜入您想要的深度。我正在学习链接器,加载器,二进制格式。我也熟悉PE文件格式。
答案 0 :(得分:12)
我已经从my own post复制并粘贴了它:
.NET dll的格式为:
PE头是所有Win32应用程序和库都具有的可移植可执行头,并指示Windows如何处理该文件。使用.NET程序集,这将加载CLR,CLR又加载程序集。
这包含诸如.exe版本或.x或汇编编写的.NET版本,任何强名称签名哈希,文件中可以找到资源的地址(RVA或相对虚拟地址)等信息。最重要的是应用程序的入口点,它是指向MethodDef元数据表或其他文件的标记。对于类库,此标记为0。
这是有关存储在几种不同类型的“流”中的模块的信息。这些流通常是压缩的,但#〜除外,它可以解压缩以进行编辑并继续。流有两种形式,一种只用于存储的堆和表。
DLL /程序集的各个部分根据它们的作用存储在不同的表中 - 例如,所有类型都存储在TypeRef
表中,Method
表中的所有方法。每个表都引用一个父表。
表的起点是Module表,它只包含模块的名称和guid作为单行。之后是ModuleRef表,其中包含有关此模块引用的所有模块的信息(来自同一程序集)。在VS.NET及其使用csc.exe的情况下,程序集中没有多个文件,只有一个模块。
此后是TypeDef表,其中包含6个列,其中包含类型的名称,名称空间,其父级(接口和对象为0),FieldDef表中其字段的起始行,MethodDef表中其方法的起始行。
应用程序本身。
如果您有兴趣,book Inside Microsoft .NET IL Assembler - Serge Lidin 会详细介绍。
答案 1 :(得分:4)
这是一个很好的问题。 .NET DLL和普通DLL之间存在一个重要的区别,为了这个答案,让我们使用术语本机DLL作为不依赖于.NET框架的普通DLL。
关键区别在于.NET PE标头布局中有第15个数据目录条目,本机DLL只有14个数据目录条目。这就是你如何区分两者之间的区别,对于本机DLL,该条目将为零!而且不仅如此,.NET DLL将嵌入元数据以便框架相应地处理它,例如请求安全权限的属性等,这同样适用于.NET EXE。
关于伪装成DLL的不同扩展,例如OCX和CPL,屏幕保护程序是从.EXE角度来看的非DLL扩展的另一个例子,即。那些.SCR真的是.EXE ......听起来奇怪,似乎微软做了一些应用程序来使用EXE和DLL的特定扩展,我认为这是Windows 3.1时代的延续,控制面板的CPL,OLE称为对象链接和嵌入到OCX现在ActiveX,SCR用于屏幕保护程序又称.EXE。如果同样适用于.MSCc(Microsoft Snap In Consoles中使用的服务扩展),我也不会感到惊讶
DLL注册是regsvr32
注册DLL的地方,它的类id可以在注册表的HKEY_CLASSES_ROOT下找到,这更可能是COM(组件对象模型)使COM对象全局可见所有语言,不论开发语言/环境如何。 ActiveX DLL也适用于同一类别,有些已知会自动注册自己(包括COM DLL),包括它们的类型库标识(typelib id)......
Windows 95之前的许多软件,过去常常有自己的DLL,有些是重复的,我记得常见的是CTL3D.DLL(还记得吗?那会给Windows Controls一个3D外观 - gawd!)。它有如此多的版本重复到处,这种重复和版本差异导致进入Windows 95,称为DLL地狱。就在那里,注册表在它启动时首次亮相,这是为了通过让所有类型库在一个地方注册而不是在整个地方复制DLL来解决DLL地狱,但它没有解决版本当时,导致程序出现故障,因为DLL使用了一个类ID,它被更新的DLL版本所取代,导致程序崩溃!
答案 2 :(得分:1)
普通DLL
.dll文件包含可在应用程序中用于执行特定程序功能的已编译代码,并且可能需要其他应用程序或模块(例如.exe或.dll)通过入口点加载
.Net DLL
在.NET语言(如C#或VB.NET)中实现.Net DLL(程序集)时,会生成托管程序集。托管程序集是.NET指定的组件标准。因此,.Net程序集只能用于Microsoft.NET,并且只能在.NET托管应用程序中使用。
更多信息.... Difference between Normal DLL and .Net Dll?
马特
答案 3 :(得分:0)
只有添加到其他答案的内容是c / c ++'。dll'文件只是一个命名约定 - 您可以随意调用它。因此.ocx和.cpl。
c / c ++ dll是一组代码和数据,它们在运行时使用LoadLibrary加载并映射到被调用者的地址空间。它仍然被编译为本机代码,但没有任何关于它的目标地址空间的概念,因为它被设计为由加载器修补和修复。