J'ai essayé de comprendre ceci pendant quelques jours maintenant, sans chance. J'essaie d'utiliser le [ImportMany] pour importer à partir d'un répertoire plein de DLL avec des exportations de type IEditorSystem, qui ont métadonnées personnalisées de type IEditorSystemMetadata. Je voudrais obtenir les métadonnées en premier, et le pousser vers des zones de texte, etc afin que l'utilisateur puisse choisir le système d'édition à utiliser, et lorsqu'il est sélectionné, charger ce système ...ImportMany avec des métadonnées ne pas importer
J'ai suivi les exemples comme meilleurs comme je peux, voici ce que j'ai jusqu'ici.
[ImportMany]
public ObservableCollection<Lazy<IEditorSystem, IEditorSystemMetadata>> EditorSystemList
C'est ce qu'il doit être importé:
[Export(typeof(IEditorSystem))]
[SignalSystemData("Very Very Long Name", "Short Name")]
public class MyEditorSystem: IEditorSystem
{
public MyEditorSystem()
{
}
}
et la mise en service:
AggregateCatalog Catalog = new AggregateCatalog(
new DirectoryCatalog(@".\EditorSystems"),
new AssemblyCatalog(Assembly.GetExecutingAssembly()));
CompositionContainer Container = new CompositionContainer(Catalog);
Container.ComposeParts(this);
je peux voir dans les Catalog.Parts à la fois le MyEditorSystem et le viewmodel qui a la ImportMany, mais EditorSystemList n'est jamais renseigné. Je ne reçois aucune erreur de composition.
Je pensais que cela pourrait avoir quelque chose à voir avec le Lazy <>, donc j'ai essayé
public ObservableCollection<IEditorSystem> EditorSystemList
Pas de chance non plus.
La seule complication que je peux penser est que j'utilise Cinch, qui utilise MEFedMVVM, qui utilise également MEF. Je ne pense pas que ça interfère, mais je ne suis pas vraiment sûr.
Je me dis que je me trompe, quelqu'un peut-il donner un sens à cela?
Mise à jour:
Mettre en oeuvre une nouvelle IComposer, avec exactement le catalogue dont vous avez besoin.
ImportMany échoue toujours, mais seulement quand j'essaye d'importer des métadonnées avec lui. Les métadonnées sont juste un couple de chaînes, et autant que je suis capable de déterminer, suit les exemples. FINALEMENT trouvé la cause: Les implémentations de IEditorSystem sont dans une DLL séparée, comme indiqué précédemment. Cependant, les nouvelles versions de la DLL ne sont pas copiées dans le sous-répertoire de sortie du projet principal. J'avais copié le premier manuellement, et j'ai oublié d'ajouter une copie de post-construction au projet dll. Eh bien, appris un tas de choses sur MEF, donc pas complètement gaspillés jours :)
Je l'ai changé en IEnumerable, mais l'importation ne semble jamais se faire, EditorSystemList reste à [0] ... – Kage
Avez-vous essayé d'exécuter le code exact d'en haut? vous devriez être capable de créer une application console pour tester cela. – JoshVarga
Oui, la version de la console fonctionne, mais il semble que cela soit dû au fait que MEFedMVVM ait brouillé les choses. – Kage