c# reflection dependencies add-on

c# - Reflection.Net: ¿cómo cargar dependencias?



dependencies add-on (5)

Intento agregar un sistema de complementos a mi aplicación Windows.Net usando Reflection; pero falla cuando hay un complemento con dependencie.

La clase Addon debe implementar una interfaz ''IAddon'' y tener un constructor vacío.
El programa principal carga el complemento usando Reflection:

Assembly assembly = Assembly.LoadFile(@"C:/Temp/TestAddon/Addon.dll"); Type t = assembly.GetType("Test.MyAddon"); ConstructorInfo ctor = t.GetConstructor(new Type[] { }); IAddon addon= (IAddon) ctor.Invoke(new object[] { }); addon.StartAddon();

Funciona muy bien cuando addon no usa dependencie. Pero si mi complemento hace referencia y usa otra DLL (C: / Temp / TestAddon / MyTools.dll) que se guarda cerca del complemento en el disco, falla:
System.IO.FileNotFoundException: No se pudo cargar el archivo o ensamblado ''MyTools.dll'' o una de sus dependencias.

No quiero copiar la DLL de complementos cerca de mi ejecutable, ¿cómo puedo hacer para decirle a .Net runtime que busque en "C: / Temp / TestAddon /" cualquier dependencia?

Tenga en cuenta que agregar

Assembly assembly = Assembly.LoadFile(@"C:/Temp/TestAddon/MyTools.dll");

no cambies nada


¿Has buscado utilizar un contenedor de inversión de control ? Uso Castle Windsor con un archivo Boo externo que me permite extender fácilmente la aplicación sin tener que volver a compilar ni preocuparme por el suministro de dependencias


Assembly.LoadFrom funciona bien hasta que intento utilizar un webService en mi complemento, tuve la excepción " No se puede lanzar el objeto de tipo ''X'' para escribir ''X'' ".

Es feo, pero usaré Assembly.LoadFile con AppDomain.AssemblyResolve.

Gracias chicos.


Puede usar la reflexión para acceder al Assembly. privado Assembly. _GetReferencedAssemblies() .

Aunque el método podría cambiar en una versión futura del framework .NET, no parece probable que ASP.NET dependa mucho de él, aunque es posible que puedan moverlo de mscorlib a System.Web que es el único ensamblado que Sé de dónde se hace referencia al método.


Si MyTools.dll está ubicado en el mismo directorio que Addon.dll , todo lo que necesita hacer es llamar a Assembly.LoadFrom lugar de Assembly.LoadFile para que el código funcione. De lo contrario, manejar el evento AppDomain.AssemblyResolve es el camino a seguir.


Un par de opciones:

  1. Puede adjuntar a AppDomain.AssemblyResolve para ayudar al CLR a resolver el ensamblaje.
  2. Podría buscar aislar complementos en su propio AppDomain (ver el espacio de nombres System.AddIn y este sitio web ).