Scénario: J'utilise Managed Extensibility Framework pour charger des plugins (exports) à l'exécution sur la base d'un contrat d'interface défini dans une DLL distincte . Dans ma solution Visual Studio, j'ai 3 projets différents: L'application hôte, une bibliothèque de classes (définissant l'interface - "IPlugin") et une autre bibliothèque de classes implémentant l'interface (l'export - "MyPlugin.dll"). L'hôte recherche les exportations dans son propre répertoire racine. Pendant les tests, je compile l'ensemble de la solution et copie Plugin.dll du dossier bin de bibliothèque de plugins/release vers le répertoire de débogage de l'hôte afin que DirectoryCatalog de l'hôte trouve et pouvoir l'ajouter au CompositionContainer. Plugin.dll n'est pas automatiquement copié après chaque reconstruction, donc je le fais manuellement chaque fois que j'ai apporté des modifications au contrat/à l'implémentation.MEF: "Impossible de charger un ou plusieurs des types demandés Récupérer les LoaderExceptions pour plus d'informations"
Cependant, deux ou trois fois je l'ai exécuté l'application hôte sans avoir copié (un jour) plugin.dll en premier lieu, et il a jeté une exception lors de la composition:
Unable to load one or more of the requested types. Retrieve the LoaderExceptions for more information
Ceci est Bien sûr, en raison du fait que le Plugin.dll, il essaie d'importer à partir d'implémente une version différente de IPlugin, où les signatures de propriété/méthode ne correspondent pas. Bien qu'il soit facile d'éviter cela dans un environnement contrôlé et surveillé, en évitant simplement (duh) les implémentations IPlugin obsolètes dans le dossier plugin, je ne peux pas me fier à de telles suppositions dans l'environnement de production, où des plugins hérités pourraient être rencontrés.
Le problème est que cette exception gomme effectivement toute l'action Compose et que les exportations sont importées. J'aurais préféré que les implémentations IPlugin non concordantes soient simplement ignorées, de sorte que d'autres exportations dans le (s) catalogue (s), implémentant la version correcte d'IPlugin, sont toujours importées.
Existe-t-il un moyen d'accomplir ceci? Je pense soit plusieurs options possibles:
- Il y a un drapeau à mettre sur le CompositionContainer (« ignorer les importations ne ») avant ou lors de l'appel Compose
- Il y a un drapeau similaire à indiquer sur la
<ImportMany()>
attribut - Il est un moyen de « crochet » sur le processus d'itération sous-jacente Compose(), et être en mesure de traiter chaque (échec) importation individuellement
- utilisant le nom forte signature d'une certaine façon que chercher des importations d'application de la version actuelle de IPlugin
Idées?
Je vais jeter un oeil. Et oui, je suis sûr que je veux les ignorer - je ne peux pas les utiliser de toute façon, et ils gâchent pour tous ceux que je veux, donc c'est une évidence, non? :) – d7samurai
@ d7samurai: Certaines personnes finiront ici par googler le message d'exception. Je voulais juste souligner pour eux que cela ne résout pas la cause sous-jacente de l'erreur. En outre, l'introduction de l'échec silencieux (aka "sur l'erreur reprend le comportement suivant") n'est pas exactement une évidence; cela peut grandement compliquer la détection et le diagnostic des bogues. Je recommande au moins de donner quelques indications à l'utilisateur que quelque chose de mal est arrivé. –
Bien sûr. Par "ignorer", je veux dire "avancer sans le laisser arrêter tout le processus d'importation". Il n'y a pas d'utilisateur, car il s'agit d'un service Windows, mais tout ce que fait (bootstrapper) est journalisé, les opérations normales et les exceptions (y compris le dumping de toutes les exceptions dans "LoaderExceptions" - lorsque cela s'applique). – d7samurai