2011-05-06 16 views
18

Me han encomendado la tarea de crear un nuevo módulo para una aplicación y, por lo tanto, agrego nuevas DLL al proyecto. Esto está bien y bien.Uso de múltiples versiones de la misma DLL

Sin embargo, en mis DLL me gustaría usar una nueva versión de una DLL externa (sobre la cual no tengo control). Si solo hago referencia a la nueva DLL y trabajo solo con esa, mi código funcionará, pero el código anterior dejará de funcionar.

Could not load file or assembly 'itextsharp, Version=5.0.6.0, Culture=neutral, 
PublicKeyToken=8354ae6d2174ddca' or one of its dependencies. The located assembly's 
manifest definition does not match the assembly reference. (Exception from HRESULT: 
0x80131040) 

He intentado un simple truco de cambiar el nombre DLL, pero que al parecer era un poco demasiado ingenua de mí, pensar que iba a funcionar. He intentado usar los alias externos (definiéndolos en mis referencias), pero todavía no sé cómo obtener dos archivos con el mismo nombre en una carpeta BIN ...

¿Qué debo hacer?

Respuesta

10

Puede load another version into a specific AppDomain

Posiblemente demasiado detallada, pero aquí es un artículo que demuestra el uso de dominios de aplicación en un entorno útil y cómo funcionan:

http://msdn.microsoft.com/en-us/magazine/cc164072.aspx

En un sentido muy básico, se reduce a este código de ejemplo:

AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    ... 

    static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     if (/*some condition*/) 
      return Assembly.LoadFrom("DifferentDllFolder\\differentVersion.dll"); 
     else 
      return Assembly.LoadFrom(""); 
    } 
+0

No era tan bonita como esperaba, pero hizo el trabajo. ¡Gracias! – Shaamaan

+1

Me permití editar tu respuesta para incluir una muestra de código que utilicé para resolver el problema. Pero la razón principal es que el segundo enlace ha muerto hace mucho tiempo. ¿Podría, por casualidad, vincular un recurso similar al anterior? – Shaamaan

+1

@Shaamaan No tengo forma de encontrar a qué se refiere el enlace original :(Aquí hay una buena página de entrada que podría ser un buen reemplazo: https://msdn.microsoft.com/en-us/library/ms172158(v=vs .110) .aspx – sehe

0

Si la solución dominios de aplicación no es aplicable en su caso, que se encuentran bajo la presión del tiempo, tener requisitos conflictivos (como que nunca sucede), y no les importa hacks ridículamente artificiales:

  • Descompilar la versión más reciente de la asamblea con la función ildasm (parte de el indicador de comandos del desarrollador incluido con Visual Studio)
  • Edite el archivo .il generado para buscar/reemplazar las referencias del espacio de nombres del ensamblado. Usando el ejemplo citado, esto sería un cambio de itextsharp.X-itextsharp.new.X
  • Asimismo, editar el valor para la AssemblyTitleAttribute. Esto requiere traducir los caracteres ASCII a hexadecimal.
  • volver a compilar el archivo .il usando ilasm
  • Tenga en cuenta que esto puede ser necesario repetir para cualquier ensamblados dependientes (por ejemplo - someassembly.core.whatever)
  • añadir el nuevo .dlls a su proyecto con un nombre diferente y hacer referencia a ellos explícitamente (en lugar de a través de Nuget o lo que sea)

Oye, no me mires así.Dije truco ridículamente ideado ...

Cuestiones relacionadas