日期:2014-05-18  浏览次数:21038 次

什么是DLL陷阱?(看题内容然后详解)
希望大家帮助一下: 
1.我要做一个课题,要做PPT,还要演讲!我不大懂这个DLL是什么!请大家尽量多的帮我提供一些资料,俗话说人多力量大,找的资料也会更全面!!谢谢。
2.我应该从那个角度上讲?我要讲解那个地方?好让老师和同学更明白,更完美?
请大家各抒己见,路过的就帮我多的找找资料,和发表一下我要讲解的地方!!谢谢
这是我考试的一个课题,在大家的热心帮助下我会考的更好的!最后谢谢大家!

------解决方案--------------------
1. 什么是DLL陷阱?
NET是如何避免DLL陷阱的?
2. 什么是DLL?
DLL(Dynamic Link Library)
动态链接库:是包含函数和数据的模块的集合。
一般来说,DLL多数情况下是带有DLL扩展名的文件 ,但也可能是 (.dll、.drv、.fon、.sys 和许多以 .exe为扩展名的系统文件都可以是 DLL)。
3. 动态链接库( DLL)它们向运行于操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。
 
动态链接库(DLL)在许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。

一个应用程序可有多个DLL文件,一个DLL文件也可能被几个应用程序所共用,这样的 DLL文件被称为共享DLL文件。
4. DLL可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

区别在于DLL中虽然包含了可执行代码却不能单独执行,而应由Windows应用程序直接或间接调用。 

在Windows操作系统中, DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。
5. 而有些DLL文件可以被许多程序共用,因此, 程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多, DLL文件也就会越来越多, 如果当你删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。

在Windows操作系统中,DLL文件一般被存放在C:\Windows\System目录下。

DLL不是独立运行的程序,它是某个程序的一个部分,它只能由所属的程序调用。用户不能,也不需要打开它。 
6. DLL 的优点
? 下列说明了当程序使用 DLL 时提供的一些优点:
? 使用较少的资源
当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在 Windows 操作系统上运行的程序。
? 推广模块式体系结构
DLL 有助于促进模块式程序的开发。这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。 
7. 简化部署和安装
当 DLL 中的函数需要更新或修复时,部署和安装 DLL 不要求重新建立程序与该 DLL 的链接。此外,如果多个程序使用同一个 DLL,那么多个程序都将从该更新或修复中获益。当您使用定期更新或修复的第三方 DLL 时,此问题可能会更频繁地出现。
8. 假设有一函数库X供三个应用程式A、B、C使用,如果函数库为目的码或原始程式码,则程式编译之後,函数库X将会各自成为执行档A、B、C的一部份,而将来如果应用程式A、B、C同时执行,函数库X也会各自占用一份记忆体,显然这是比较浪费记忆体的方式。 

如果函数库为DLL形式,则编译之後,函数库并不会成为执行档的一部分,而将来如果应用程式A、B、C同时被执行,则系统只会载入一份函数库让程式A、程式B、程式C共用,如图
10. DLL的问题 - DLL Hell   
  
动态连结档到底出了什麽问题会变成DLL-Hell呢?

其实DLL的优点(程式码共用、节省记忆体),正是其缺点的起源。原本是良
好的DLL, 有一天会变成DLL Hell,恐怕这也是当初DLL的设计者所始料未及的。

 而之所以会出现DLL Hell,也是因为动态连结档可以与其他程式共用函数、共享资源所引起的,可谓「成也共用、败也共用」。

为了要使用其他程式共用动态连结档所提供的函数或资源,动态连结档的设计者必须相当谨慎地、缜密地考虑到功能的一致性、回溯相溶等细节问题,否则一旦程式所使用动态连结档没有提供所预期的功能,那麽使用者就会为此而掉入DLL地狱。
11. DLL Hell 的状况 

如果某一副程式或物件类别有90%符合我们的需求,却有10%不符合,怎麽办呢?
对副程式来说,大概只有修改「原始程式码」一途。 

假设程式A会使用物件X,在程式A安装到系统时,会同时安装物件X,假设另一 
个程式B也会使用到物件X,那麽程式B直接复制到硬碟中即可正常运作,因为物件X已经存在於系统中,这听起来很好,因为程式A与程式B可以共用物件X。然而对程式A来说,原本在安装後,执行得好好的,却可能在未知的一天变成无法执行,这就是所谓的DLL Hell。
12以下为描述DLL Hell的两种状态。 
? 状况 1. 动态连结档没有善尽回溯相容的责任

如果程式A使用的是1.0版的物件X,而程式B使用的是 2.0 版的物件X(通常是因为程式B开发的时间较晚,使用较新的版本),结果会怎样呢?结果在程式B被安装到系统时,物件X 2.0版也必须安装到系统中,此时系统中 1.0 版的物件X将会被 2.0 版所取代。

在大部分的情况下,物件X 2.0版相容於1.0版,所以程式A依然可以正常运作,但有时候却会出现 2.0 版及 1.0 版不相容的情况,此时程式A便无法正常执行了。此种DLL Hell的起因则是设计者,原因在於动态连结档没有善尽回溯相容的原则。试着想想A.exe 需要 X.dll 所提供的功能,但是在新版的 X.dl l里面,功能竟然被取消了,这时候也极可能发生DLL Hell。 
13状况 2. 动态连结档善尽回溯相容的责任, 但动态连结档本身出现bug

另一种情况,物件X的提供者确实考虑到版本相容的问题,而根据物件的规格来看,
新旧版也的确相容,但程式A使用新版的物件X就是有问题,毕竟程式A并没有与新版的物件X一起运作过,谁知道会发生什麽情况! 
例如:X 1. 0 之中有一个名为 Value 的属性名称, 当此一属性设为负数时, 该属性就会变成零, 但却不会出现错误讯息。但这个做法是错误的, X 2.0版将此问题解决了- 若将Value属性设为负数, 则会抛出错误。

当程式 B 以 X 2.0 散布时, 这支程式B 就可以正常运作。不过, 如果将 X 2.0 安装在系统之中, 程式A 会出错。之前程式将Value 属性设为 -1 不会有问题, 这就是执行时期的错误。
14. DLL 总结
? 当某个程序或 DLL 使用其他 DLL 中的 DLL 函数时,就会创建依赖项。因此,该程序就不再是独立的,并且如果该依赖项被损坏,该程序就可能遇到问题。例如,如果发生下列操作之一,则该程序可能无法运行: 

? 依赖 DLL 升级到新版本。
? 修复了依赖 DLL
? 依赖 DLL 被其早期版本覆盖
? 从计算机中删除了依赖 DLL
这些操作通常称为 DLL-Hell 。如果没有强制实现向后兼容性,则该程序可能无法成功运行。
15. 在许多真实的案例中, 要善尽相容模式控制DLL版是非常困难的,往往可能造成DLL Hell。
那.NET 如何解决DLL Hell 的问题的?
16. 1. Windows 文件保护
? 在 Windows 文件保护中,操作系统禁止未经授权的代理更新或删除系统 DLL。
2. DLL 故障排除工具