Reflection.Net: comment charger les dépendances?
J'essaie d'ajouter un addons système à mon Windows.Net application à l'aide de la Réflexion; mais il échoue quand il y a addon avec dependencie.
Addon de classe ont pour implémenter une interface 'IAddon" et d'avoir un constructeur vide.
Le programme principal la charge de l'addon, à l'aide de la Réflexion:
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();
Il fonctionne très bien lors de l'addon ne pas utiliser dependencie.
Mais si mon addon de référence et l'utilisation d'une autre DLL (C:\Temp\TestAddon\MyTools.dll) qui est enregistré près de l'addon dans le disque, il ne parvient pas à:
Système.IO.FileNotFoundException: impossible de charger le fichier ou l'assembly 'MyTools.dll" ou une de ses dépendances.
Je ne veut copier les addons DLL près de mon exécutable, comment puis-je faire pour le dire .Net à la recherche de "C:\Temp\TestAddon\" de toute dépendance?
Notez que l'ajout d'
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");
ne pas changer quoi que ce soit.
Vous devez vous connecter pour publier un commentaire.
Si MyTools.dll est situé dans le même répertoire que Addon.dll, tout ce que vous devez faire est d'appeler
Assembly.LoadFrom
au lieu deAssembly.LoadFile
afin de rendre votre code de travail. Sinon, la manipulation de laAppDomain.AssemblyResolve
événement est le chemin à parcourir.Avez-vous regardé dans l'aide d'une L'Inversion De Contrôle conteneur? J'utilise Château de Windsor avec un externe Boo fichier qui me permet de facilement étendre l'application reposant sans avoir à recompiler ou d'inquiétude au sujet de la fourniture de dépendances
Vous pouvez utiliser la réflexion pour l'accès privé
Assembly.
_GetReferencedAssemblies()
.Bien que, la méthode pourrait changer dans une future version de l' .NET framework, il ne semble pas likely-ASP.NET fortement en dépend, s'il est possible qu'ils puissent aller de
mscorlib
àSystem.Web
qui est la seule assemblée, que je sache d'où la méthode est appelée.De l'assemblée.LoadFrom fonctionne bien jusqu'à ce que j'essaie d'utiliser un webService dans mon addon, j'avais eu un "Impossible de convertir l'objet de type 'X' de type 'X'" l'exception".
C'est moche, mais je vais utiliser de l'Assemblée.LoadFile avec le domaine d'application.AssemblyResolve.
Merci les gars.
Deux options:
AppDomain.AssemblyResolve
pour aider le CLR résoudre l'assemblée.AppDomain
(voirSystem.AddIn
espace de noms et ce site internet).