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:
- Puede adjuntar a
AppDomain.AssemblyResolve
para ayudar al CLR a resolver el ensamblaje. - Podría buscar aislar complementos en su propio
AppDomain
(ver el espacio de nombresSystem.AddIn
y este sitio web ).