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

我一直听到关于DLL地狱 – 这是关于什么?

当应用程序A安装共​​享DLL v1.0时,应用程序B出现并将共享DLL更新为v1.1,这应该是兼容的,但是存在稍微不同的行为,则应用程序A停止正常工作并重新安装v1.0,然后应用程序B停止工作…现在想象这与超过2个应用程序让我们说一打:DLL地狱。

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

然后,你会得到一个新的应用程序安装并注册一个新版本的DLL的情况下,从而打破真正想要旧版本的应用程序。 你会重新安装旧的应用程序,并打破新的过程中。

使用.NET,不需要注册DLL(GAC是一种特殊情况,并且可以避免上述的版本问题),加载器只是通过查找正确的path来拾取组件。

简而言之,在使用良好的旧COMdate之前,每个COM组件必须被注册(在registry中创build一个条目)。 然后你的程序将通过提供types名称(这是registry中的一个键)来创build一个新的对象。 而现在你不能控制哪个DLL真的被加载,其他软件会注册一些更新/更旧/完全不同的这个DLL版本,等等。

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

最近版本的Windows能够存储多个版本的DLL,并提供正确的请求。

这发生在应用程序将DLL安装到系统中,而另一个应用程序将其replace为与旧版本不兼容的另一个版本的DLL。

这在c#(以及一般的.NET)中不是问题,因为.NET程序集足够聪明,可以感知版本(而.NET有GACpipe理不同的版本)。