2011-07-07 8 views
7

Tengo una biblioteca de terceros que requiere que se cargue un ensamblaje A cuando llamo a su código. Ese ensamblaje generalmente se instala en el GAC, por lo que tengo varias opciones para cargarlo:¿Cómo debo forzar la carga de un ensamblaje al que se hace referencia?

  1. Puedo llamar explícitamente al Assembly.Load(). Sin embargo, eso requiere el nombre completo que no me siento cómodo codificar en mi programa.
  2. Puedo llamar explícitamente al Assembly.LoadWithPartialName(). Esa es una API obsoleta, por supuesto, y por supuesto no me siento cómodo para perder el control en el control de versiones.
  3. Puedo hacer referencia al ensamblaje en mi archivo de proyecto de Visual Studio, por lo que siempre obtengo la versión que construí. Sin embargo, eso no funcionará a menos que creara un objeto ficticio en ese ensamblaje. El compilador de C# simplemente lo ignora si no lo hago.
  4. Mismo problema si llamo al Assembly.GetReferencedAssemblies y fuerzo a cargar el emparejado. El compilador de C# simplemente no hará referencia a mi ensamblado, incluso si lo coloco en la lista de referencias.

Ahora lo que estoy haciendo es llamar al typeof(A.Foo).Assembly.GetName() e ignorar el valor de retorno. Hay una mejor manera de hacerlo?

+0

¿Qué hay de la opción n. ° 1 pero pone el nombre completo del ensamblado en app.config (u otra configuración similar) archivo)? De esta forma, obtienes lo mejor de ambos mundos: una carga explícita del ensamblaje que deseas, pero la flexibilidad de actualizar sin una recompilación si necesitas – dkackman

+0

@dkackman, eso es algo que también necesito actualizar manualmente. Quería que Visual Studio recogiera la versión actual del control de versiones, de modo que obtengo la versión en tiempo de compilación, en lugar de tiempo de codificación o tiempo de ejecución. –

+0

@focey - hmmm, tiene un olor a pescado pero ... ¿paso posterior a la construcción? obtener el ensamblaje, la versión de hurgar, escribir en el archivo de configuración? Probablemente sea mejor seguir haciendo lo que está haciendo, aunque tampoco me gusta. – dkackman

Respuesta

1

La opción 1, para mí, sería hacer referencia a ella en el proyecto VS.

Pero si desea un enfoque más pasivo, puede utilizar el controlador de eventos AppDomain.CurrentDomain.AssemblyResolve. Se ejecuta cuando se necesita un ensamblaje que no se encuentra en AppDomain. El evento args le dirá la Asamblea que se está buscando y puede ir a agarrarlo en ese punto usando Assembly.Load()

+1

Gracias. Desafortunadamente, la biblioteca de terceros llama a 'AppDomain.CurrentDomain.GetAssemblies()' y la lanza si no se encontró la requerida. –

+3

@focey - eso es whack – dkackman

+0

totalmente golpeado !! –

Cuestiones relacionadas