2009-09-22 13 views
11

Tengo varias aplicaciones .NET en C#, junto con una API para que puedan acceder a la base de datos. Quiero poner todas las versiones de la API en la base de datos y pedirles que seleccionen el número más alto de revisión y compilación, pero mantengan el número mayor y menor con el que se crearon. Básicamente, cuando hago referencia a API 1.2.3.4, quiero que la referencia lea 1.2.*.* para que las aplicaciones simplemente seleccionen 1.2.3.5. Veo que puedo hacer esto con los archivos de configuración XML. Preferiría que se cumpliera. Similar a las políticas de publicación, pero sin los archivos adicionales. Podría conformarme con eso. El otro problema son todas las soluciones que veo redireccionan una versión a otra versión específica, no solo a cualquier versión más nueva.Cómo utilizar la redirección de encuadernación por ensamblaje para ignorar los números de revisión y construcción

¿Cómo puedo hacer esto?

¿Alguien me puede indicar una fuente informativa para la política del editor?

Respuesta

5

AppDomain.AssemblyResolve evento debería ayudar.

25

Gracias a leppie's suggestion de utilizar el evento AppDomain.AssemblyResolve, pude resolver un problema similar. Esto es lo que se ve mi código como:

public void LoadStuff(string assemblyFile) 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += 
      new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
     var assembly = Assembly.LoadFrom(assemblyFile); 

     // Now load a bunch of types from the assembly... 
    } 

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var name = new AssemblyName(args.Name); 
     if (name.Name == "FooLibrary") 
     { 
      return typeof(FooClass).Assembly; 
     } 
     return null; 
    } 

Esto ignora por completo el número de versión y sustituye a la biblioteca ya cargado para cualquier referencia de la biblioteca llamada "FooLibrary". Puede usar los otros atributos de la clase AssemblyName si quiere ser más restrictivo. FooClass puede ser cualquier clase en el ensamblado de FooLibrary.

+1

Estoy tratando de hacer esto en el contexto de una aplicación ASP.NET. ¿Dónde podría engancharme en el evento AppDomain.CurrentDomain.AssemblyResolve? En un nivel de evento de la aplicación (es decir, global.asax)? –

+0

Creo que debería poder registrarse para el evento 'AssemblyResolve' desde cualquier lugar. No hay nada especial sobre el método 'LoadStuff()'. Si decide registrarse para el evento cada vez que carga un ensamblaje, simplemente recuerde anular el registro cuando haya terminado. –

+0

Hombre impresionante. Exactamente lo que estaba buscando – Jupaol

Cuestiones relacionadas