MEF charger un plugin d'annuaire
Je travaille avec le MEF et je suis à la recherche comment changer l'url de l'emplacement des plugins par un autre moyen que le MEF trouver les plugins, je veux changer cette ligne
Assembly.LoadFrom(@"C:\julia\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll")));
Je veux supprimer cette url parce que j'ai besoin de déployer mon application dans une autre machine
C'est ma fonction :
public void AssembleCalculatorComponents()
{
try
{
//var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());
//var container = new CompositionContainer(catalog);
//container.ComposeParts(this);
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new AssemblyCatalog(Assembly.LoadFrom(@"C:\yosra\project\project.Plugin.Nav\bin\Debug\NavPlugin.dll")));
var container = new CompositionContainer(catalog);
container.ComposeParts(this);
}
catch (Exception ex)
{
throw ex;
}
}
Pouvez-vous svp m'aider?
Grâce
Comme une note: vous ne devez pas utiliser
throw ex;
dans votre bloc catch (cette "détruit" la trace de la pile, c'est à dire que vous ne serez pas en mesure de vraiment savoir où l'exception s'est réellement passé). Si vous voulez re-lancer l'exception, il suffit d'utiliser throw;
(sans spécifier l'exception à nouveau) - ou tout simplement ne pas capture de l'exception, si vous ne faites rien de tout cela!OriginalL'auteur julia | 2012-06-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le DirectoryCatalog classe à avoir MEF scanner un répertoire particulier pour les assemblages qui répondent à vos importations.
Ci-dessus va ajouter le répertoire de base de l'AppDomain utilise pour la localisation des assemblées (généralement le répertoire contenant l'exécutable à moins d'une modification de la configuration) et de l'ensemble du catalogue. Vous aussi, vous vous voudrez probablement ajouter le courant de l'exécution de l'assemblée, mais il n'est pas nécessaire.
Plus d'informations sur MSDN pour DirectoryCatalog: http://msdn.microsoft.com/en-us/library/system.componentmodel.composition.hosting.directorycatalog.aspx
var catalog =new AggregateCatalog(); catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); catalog.Catalogs.Add(new DirectoryCatalog(@"./plugins")); var container = new CompositionContainer(catalog);
mais ne fonctionne pas avec moi, pouvez vous s'il vous plaît explique de plus pour moiOriginalL'auteur CalebD
Bonjour et merci pour votre réponse, mon problème était de charger le plugin directement, j'ai donc créer un répertoire et je place mes plugins dans ce dossier, donc je trouve cette solution
c'est ma solution , pense pour tous les
OriginalL'auteur julia
Deux options.
OriginalL'auteur Localghost
Si votre méthode sait de du genre à être instancié, vous pouvez utiliser le
Assembly
propriété de laType
ce qui est typique pour mon *Domaine* les bibliothèques; sinon, vous pouvez utiliserAssembly.GetExecutingAssembly()
. Je ne suis pas particulièrement friand deGetExecutingAssembly()
ouGetCallingAssembly()
...:En dehors de cela, vous pouvez ajouter DirectoryCatalogs - soit par le
app.config
fichier sérialisé liste de répertoires, etc. En commençant, bien que, vous pouvez désigner un répertoire par défaut dans votreapp.config
- qui est ce que je recommande. Ensuite, en supposant que vous utilisezSettings
:Tout en utilisant
"."
que le chemin de recherche est légitime de raccourci pour l'exécution de l'assemblée répertoire, gardez à l'esprit que tous les assemblages seront recherchés pour la réalisation de pièces - à-d., correspondantImport
/Export
objets. L'utilisation de modèles spécifiques, est ma recommandation. Microsoft exemples ne sont pas connus pour être la meilleur pratiques. Si vous vous attendez à un plugin pour être suffixé avecPlugin.dll
, faire partie de votre modèle de recherche.OriginalL'auteur IAbstract