Domanda

Provo ad aggiungere un sistema di componenti aggiuntivi alla mia applicazione Windows.Net usando Reflection; ma fallisce quando c'è un componente aggiuntivo con dependencie.

La classe Addon deve implementare un'interfaccia 'IAddon' e avere un costruttore vuoto.
Il programma principale carica l'addon 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();

Funziona benissimo quando l'addon non usa la dipendenza. Ma se il mio riferimento al componente aggiuntivo e utilizzo un'altra DLL (C: \ Temp \ TestAddon \ MyTools.dll) che viene salvata vicino al componente aggiuntivo nel disco, non riesce:
System.IO.FileNotFoundException: impossibile caricare il file o l'assemblaggio "MyTools.dll" o una delle sue dipendenze.

Non voglio copiare la DLL dei componenti aggiuntivi vicino al mio eseguibile, come posso fare per dire al runtime .Net di cercare in " C: \ Temp \ TestAddon \ " per qualche dipendenza?

Nota che l'aggiunta

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

non cambia nulla.

È stato utile?

Soluzione

Se MyTools.dll si trova nella stessa directory di Addon.dll , è sufficiente chiamare Assembly.LoadFrom di Assembly.LoadFile per far funzionare il tuo codice. Altrimenti, gestire l'evento AppDomain.AssemblyResolve è la strada da percorrere.

Altri suggerimenti

Hai esaminato l'utilizzo di un Inversion Of Control ? Uso Castle Windsor con un file Boo esterno che mi consente di estendere facilmente l'applicazione senza dover ricompilare o preoccuparmi di fornire dipendenze

Puoi usare la riflessione per accedere al Assembly._GetReferencedAssemblies() .

Sebbene il metodo potrebbe cambiare in una versione futura del framework .NET, non sembra probabile—ASP.NET dipende fortemente da esso, sebbene sia possibile che possano spostarlo da < code> mscorlib in System.Web che è l'unico assembly che conosco da dove viene indicato il metodo.

Assembly.LoadFrom funziona bene fino a quando non provo a utilizzare un servizio Web nel mio componente aggiuntivo, avevo avuto un " Impossibile lanciare un oggetto di tipo 'X' per digitare 'X' " fa eccezione.

È brutto, ma userò Assembly.LoadFile con AppDomain.AssemblyResolve.

Grazie ragazzi.

Coppia di opzioni:

  1. Puoi collegarti a AppDomain.AssemblyResolve per aiutare il CLR a risolvere l'assemblaggio.
  2. È possibile cercare di isolare i componenti aggiuntivi nel proprio spazio dei nomi AppDomain (consultare lo spazio dei nomi System.AddIn e questo sito web ).
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top