But*_*ler 32 .net dll assemblies
我想知道.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文件格式.
Chr*_*s S 12
我已经从我自己的帖子中复制并粘贴了它:
.NET dll的格式是:
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如果你有兴趣进入到更多细节.
这是一个很好的问题。.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、称为对象链接和嵌入到 OCX(现在的 ActiveX)的 OLE、用于屏幕保护程序(又名 .EXE)的 SCR。如果这同样适用于 .MSCc(Microsoft 管理单元控制台中使用的服务扩展),我不会感到惊讶
DLL 注册是regsvr32注册 DLL 的地方,它的类 ID 可以在注册表中的 HKEY_CLASSES_ROOT 项下找到,这更可能是用于 COM(组件对象模型),用于使 COM 对象对所有语言全局可见,无论开发语言如何/环境。ActiveX DLL 也属于同一类别,已知有些会自动注册自身(包括 COM DLL),包括它们的类型库标识(typelib id)...
Windows 95 之前的很多软件都有自己的 DLL,有些是重复的,我记得最常见的是 CTL3D.DLL(还记得吗?这会给 Windows 控件带来 3D 外观 - 天哪!)。它有如此多的版本在各地重复,这种重复和版本差异导致了 Windows 95,即所谓的 DLL 地狱。正是在那里,注册表在启动时首次亮相,其设计目的是通过将所有类型库注册在一个位置来绕过 DLL 地狱,而不是在各处复制 DLL,但它没有解析版本当时,导致程序出现损坏,因为 DLL 使用了一个类 ID,该 DLL 被更新的 DLL 版本取代,导致程序损坏!
唯一需要添加到发布的其他答案中的是 ac/c++ '.dll' 文件只是一个命名约定 - 您可以将其称为任何您喜欢的名称,因此 .ocx 和 .cpl。C/C++ DLL 是一组代码和数据,在运行时使用LoadLibrary
加载并映射到被调用者的地址空间。它仍然被编译为本机代码,但没有任何目标地址空间的概念,因为它被设计为由加载器进行修补和修复。
| 归档时间: |
|
| 查看次数: |
11546 次 |
| 最近记录: |