2009-09-04 3 views

Respuesta

52

Es cuando la Aplicación A instala una DLL compartida v1. 0, la aplicación B viene y actualiza la DLL compartida a v1.1 que debería ser compatible, pero hay comportamientos ligeramente diferentes, luego la aplicación A deja de funcionar correctamente y reinstala v1.0 luego la aplicación B deja de funcionar ... ahora imagínese esto con más de 2 aplicaciones digamos una docena: DLL Hell.

+7

Y este problema ahora está sucediendo con .NET, aunque es menos común. Si tienes una aplicación que usa dos ensamblajes, y esos dos usan un tercer ensamblaje, entonces estás en .NET Hell. Especialmente si esos dos ensamblajes utilizan cada uno una versión diferente de este tercer ensamblaje ... –

+1

Pero esperen, ¿no han resuelto este problema implementando versiones paralelas? – user3509153

6

En pocas palabras, en los buenos viejos días COM cada componente COM tenía que registrarse (se creó una entrada en el registro) antes de ser utilizado. Entonces su programa crearía un nuevo objeto al proporcionar el nombre de tipo (que era una clave en el registro). Y ahora no tenía ningún control sobre qué dll realmente se cargaría, cualquier otro software registraría alguna versión más nueva/antigua/completamente diferente de este dll, etc.

4

Ocurre cuando una aplicación instala un dll en el sistema, y ​​otra aplicación lo reemplaza con otra versión de la DLL que no es compatible con la anterior.

No es un problema en C# (y .NET en general) porque los ensamblados .NET son lo suficientemente inteligentes como para ser compatibles con la versión (y .NET tiene el GAC que maneja diferentes versiones).

+2

Excepto que .NET ignora el número de revisión (4º elemento en la versión) y es posible tener revisiones incompatibles. Sucedió a un colega con un componente suministrado por Microsoft, nada menos. –

+0

@Michael Borgwardt: Es una adición valiosa, gracias. –

12

DLL infierno era en su mayoría de los días COM, donde tenía que registrarse un dll COM, y los clientes de la buscarían en el registro. Fue una pesadilla porque el sistema de archivos (* .dll, * .ocx) podría modificarse dejando entradas obsoletas en el registro. Las aplicaciones dejarían de funcionar, fue horrible.

A continuación, obtendrá el escenario donde se instala una nueva aplicación y registra una nueva versión de la DLL, rompiendo así las aplicaciones que realmente querían la versión anterior. Volverías a instalar la aplicación anterior y romperías la nueva en el proceso.

Con .NET, no es necesario registrar los archivos DLL (el GAC es un caso especial y tiene una disposición para evitar el problema de control de versiones descrito anteriormente), el cargador solo recoge los ensambles buscando en las rutas correctas.

+0

¿Qué significa COM? – user1534664

+5

Representa el Modelo de Objetos Componentes (http://en.wikipedia.org/wiki/Component_Object_Model).Se suponía que era una forma común de que el software de Windows hablara entre sí/reutilizara bibliotecas, etc. ActiveX es un buen ejemplo. Una biblioteca podría exponer las interfaces COM ya que es un contrato, y otra aplicación escrita en un idioma diferente podría consumir esa biblioteca siempre que tenga soporte COM. Todas las bibliotecas creadas con VB6 eran bibliotecas COM: deben registrarse en el registro de Windows para que otras aplicaciones las descubran. –

5

Simple: en las versiones anteriores de Windows, era posible tener múltiples aplicaciones intentando acceder a la misma biblioteca compartida. No hay problema allí, es por eso que son compartidos. el problema surge cuando diferentes aplicaciones intentan acceder a diferentes versiones del mismo ensamblaje desde una ubicación central. Si todas las versiones posteriores del dll son compatibles con versiones anteriores, y si tiene la versión más reciente, no debería haber ningún problema, pero si instala una aplicación que requiere v2, y luego instala una aplicación que requiere (e incluye) la versión 1. x, es posible que la primera aplicación deje de funcionar (porque la dll v2 se sobrescribió con v1.x).

Las versiones recientes de Windows son capaces de almacenar múltiples versiones de un dll, y suministrar el correcto a pedido.

Cuestiones relacionadas