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

我一直听说DLL地狱-这是什么?,dll,Dll,我一直听说DLL地狱-这是怎么回事?简而言之,在过去的COM时代,每个COM组件在使用之前都必须注册(在注册表中创建了一个条目)。然后,您的程序将通过提供类型名(注册表中的一个键)来创建一个新对象。现在,您无法控制要加载的dll,其他软件是否会注册此dll的更新/旧/完全不同的版本,等等。应用程序A安装共享dll v1.0时,应用程序B来将共享DLL更新到v1.1,该DLL应兼容,但存在稍微不同的行为,然后应用程序A停止正常工作并重新安装v1.0,然后应用程序B停止工作。。。现在想象一下,如果有

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

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

应用程序A安装共享dll v1.0时,应用程序B来将共享DLL更新到v1.1,该DLL应兼容,但存在稍微不同的行为,然后应用程序A停止正常工作并重新安装v1.0,然后应用程序B停止工作。。。现在想象一下,如果有两个以上的应用程序,比如说一打:DLL地狱。

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


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

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

然后,您将看到一个新应用程序安装并注册新版本的DLL的场景,从而破坏了真正需要旧版本的应用程序。您将重新安装旧应用程序,并在此过程中中断新应用程序


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

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


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

除了.NET忽略版本号(版本中的第四个元素)以及可能存在不兼容的版本之外。发生在一位同事身上,他的组件是由微软提供的。@Michael Borgwardt:这是一个很有价值的补充,谢谢。它现在已经被.NET地狱所取代了。;-)这个问题现在发生在.NET上,尽管它不太常见。如果您的应用程序使用两个程序集,而这两个程序集都使用第三个程序集,那么您就陷入了.NET地狱。特别是如果这两个程序集各自使用第三个程序集的不同版本……等等,它们不是通过实现并行版本控制解决了这个问题吗?它代表组件对象模型()。这应该是Windows软件相互对话/重用库等的常见方式。ActiveX就是一个很好的例子。一个库可以按照它的约定公开COM接口,而另一个用不同语言编写的应用程序仍然可以使用该库,只要它有COM支持。任何使用VB6构建的库都是COM库-它们必须在Windows注册表中注册,以便其他应用程序发现它们。