Reflection.Net: come caricare le dipendenze?
-
05-07-2019 - |
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.
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:
- Puoi collegarti a
AppDomain.AssemblyResolve
per aiutare il CLR a risolvere l'assemblaggio. - È possibile cercare di isolare i componenti aggiuntivi nel proprio spazio dei nomi
AppDomain
(consultare lo spazio dei nomiSystem.AddIn
e questo sito web ).