2008-10-08 12 views
24

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

La clase de complemento tiene que implementar una interfaz 'IAddon' y tener un constructor vacío.
programa principal cargar el complemento usando Reflexión:Reflection.Net: cómo cargar dependencias?

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 complemento no utilizan dependencie. Pero si mi complemento hace referencia y usa otra DLL (C: \ Temp \ TestAddon \ MyTools.dll) guardada 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 la adición de

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

no cambie nada.

Respuesta

35

Si MyTools.dll se encuentra en el mismo directorio que Addon.dll, todo lo que tiene que hacer es llamar Assembly.LoadFrom en lugar de Assembly.LoadFile para hacer su trabajo de código. De lo contrario, manejar el evento AppDomain.AssemblyResolve es el camino a seguir.

1

par de opciones:

  1. Puede adjuntar a AppDomain.AssemblyResolve para ayudar a resolver el CLR la asamblea.
  2. Puede buscar aislar complementos en su propio AppDomain (consulte System.AddIn namespace y this website).
2

¿Ha considerado utilizar un contenedor Inversion Of Control? Yo uso el castillo de Windsor con un archivo externo Boo que me permite extender fácilmente el applcation sin tener que recompilar o preocuparse acerca de las dependencias que suministran

1

Puede utilizar la reflexión para acceder a la privada Assembly._GetReferencedAssemblies().

Aunque, el método podría , no parece cambio en una versión futura del marco .NET likely-ASP.NET depende en gran medida de que, aunque es posible que pudiera moverlo mscorlib-System.Web que es el único ensamblaje que conozco de donde se hace referencia al método.

1

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

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

Gracias chicos.

Cuestiones relacionadas