DLL噩梦
DLL HELL字面意思是DLL”灾难”,是由于com组件升级引起的程序不能运行的情况。
COM对象常常被编译为dll文件。COM组件模型虽然很不错,但是它自身存在致命的缺陷。由于COM对象可以被重用,这样多个程序可能使用一个COM对象 ,如果这个COM组件升级了,就很有可能出现其中某个程序无法使用新组件,导致程序不能运行的情况,这种情况被称为“DLL HELL”。有时安装了新的软件后很多其他的软件都无法使用,往往就是这个原因。
Windows系统是以Dynamic Link Library(动态链接库)的方式让系统和应用软件共用所有的系统文件的。
DLL Hell的意思就是因为系统文件被覆盖而让整个系统像是掉进了地狱(什么软件都不能运行了)。
可能的原因
很多windows的应用程序在发布的时候会将它们所有要用到的DLL都一起打包发布,很多应用程序的安装程序都不是很成熟,经常在安装的时候将一个旧版本的DLL覆盖掉一个更新版本的DLL,从而导致其他的应用程序运行失败。有些安装程序比较友好,如果碰到需要覆盖新版的DLL时,它会弹出一个对话框提醒用户是否覆盖,但是即使这样,有些应用程序只能运行在旧版本的DLL下,如果不覆盖,那么它可能无法在新版的DLL中运行。总的来说,有三种可能的原因导致了DLL Hell的发生:
一是由使用旧版本的DLL替代原来一个新版本的DLL而引起的。这个原因最普遍,是Windows 9X用户通常遇到的DLL错误之一。
二是由新版DLL中的函数无意发生改变而引起。尽管在设计DLL时候应该向下兼容,然而要保证DLL完全向下兼容却是不能的。
三是由新版DLL的安装引入一个新的Bug。