我一直听说DLL地狱 - 这是什么?

时间:2009-09-04 13:31:35

标签: dll

我一直听说DLL地狱 - 这是怎么回事?

5 个答案:

答案 0 :(得分:61)

当应用程序A安装共​​享DLL v1.0时,应用程序B出现并将共享DLL更新为v1.1,它应该兼容但行为略有不同,然后App A停止正常工作并重新安装v1.0然后应用程序B停止工作......现在想象一下,有两个以上的应用让我们说十几个:DLL地狱。

答案 1 :(得分:13)

DLL地狱主要来自COM时代,其中必须注册COM dll,并且它的客户端将在注册表中查找它。这是一场噩梦,因为可以修改文件系统(* .dll,* .ocx),在注册表中留下过时的条目。应用程序将停止工作,这太可怕了。

然后,您将获得新应用程序安装并注册新版本DLL的方案,从而打破真正需要旧版本的应用程序。您将重新安装旧应用程序,并在此过程中中断新应用程序。

使用.NET,不需要注册DLL(GAC是一种特殊情况,并且可以避免上述版本控制问题),加载程序只需通过查找正确的路径来获取程序集。

答案 2 :(得分:6)

简而言之,在旧的COM时代,每个COM组件都必须在使用之前注册(在注册表中创建了一个条目)。然后你的程序将通过提供类型名称(这是注册表中的一个键)来创建一个新对象。现在你无法控制哪个dll真正被加载,任何其他软件都可以注册这个dll的更新/更旧/完全不同的版本等。

答案 3 :(得分:6)

简单 - 在以前版本的Windows中,可能有多个应用程序都试图访问同一个共享库。没问题,这就是他们共享的原因。当不同的应用程序试图从中心位置访问同一程序集的不同版本时,问题就出现了。提供dll的所有更高版本是向后兼容的,并且您拥有最新版本应该没有问题,但是如果您安装需要v2的应用程序,然后安装需要(并包含)版本1的应用程序。 x,您可能会发现第一个应用程序停止工作(因为v2 dll已被v1.x覆盖)。

最新版本的Windows能够存储多个版本的dll,并根据请求提供正确的版本。

答案 4 :(得分:4)

当应用程序将dll安装到系统中时,会发生这种情况,而另一个应用程序将其替换为与旧版本不兼容的其他版本的dll。

这在c#(和一般的.NET)中不是问题,因为.NET程序集足够智能,可以识别版本(并且.NET具有管理不同版本的GAC)。