2009-12-28 23 views
7

Ich habe eine Winforms-Desktopanwendung, die mehrere MEF-Teile mit demselben Schnittstellentyp lädt.Mehrere MEF-Teile können nicht geladen werden

Problem: Wenn ich versuche, mehr als eine des gleichen Typs laden ich die folgende Ausnahme erhalten:

Die Zusammensetzung bleibt unverändert. Die Änderungen wurden wegen der folgenden Fehler zurückgewiesen: Die Zusammensetzung erzeugte einen einzelnen Zusammensetzungsfehler. Die Ursache ist unten angegeben. Überprüfen Sie die CompositionException.Errors-Eigenschaft für weitere Informationen.

1) Keine gültigen Exporte wurden gefunden, dass die Einschränkung ‚entsprechen ((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & &" BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))) ', ungültige Exporte wurden möglicherweise zurückgewiesen.

in Resultierende: Kann nicht importieren 'TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension")' auf einem Teil 'TaskPilot.Windows.MainForm' gesetzt. Element: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm

Hier ist der Code, um die Teile zu laden:

  AggregateCatalog catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     //string myExecName = Assembly.GetExecutingAssembly().Location; 
     //string myPath = Path.GetDirectoryName(myExecName); 
     catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.TaskPilot.FolderView\bin\Debug")); 
     catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.TaskPilot.TaskView\bin\Debug")); 
     // Uncomment below line and it works without exceptions raised 
     //catalog.Catalogs.Add(new DirectoryCatalog(@"C:\Data\TaskPilot\Development\Source\BOCA.FileManager\bin\Debug")); 

     var container = new CompositionContainer(catalog); 
     container.ComposeParts(this); 

Hier ist der Code in der Klasse für jede der MEF Teile:

[Export(typeof(IFolderItemsViewExtension)) 
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification] 

Hier ist der Import auf dem Hauptformular verwendet:

[ImportMany(AllowRecomposition = true)] 
    private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null; 

Wenn ich die letzte Catalog.Catalogs.Add-Zeile auskommentiere, wird die Ausnahme ausgelöst. Wenn ich es ohne laufen lasse, läuft es gut. Diese Zeile lädt ein anderes Benutzersteuerelement, das die IFolderItemsViewExtension-Schnittstelle implementiert. Ich habe versucht, nur ein Dummy-Projekt zu laden, das alles, was es hat, ist das Benutzersteuerelement und diese Schnittstelle und ich bekomme immer noch die gleiche Ausnahme. Egal was ich mache, ich bekomme immer noch diese Ausnahme.

Es scheint, dass alles gut läuft, solange ich nicht mehr als eine der gleichen Art von MEF Teilexport laden.

Dies verwendet die neueste Version von 2009.22.10.0 der System.ComponentModel.Composistion aus dem MEF-Download.

Antwort

4

Der Fehler zeigt an, dass kein Export vom Typ IFolderViewExtension gefunden werden kann. Beachten Sie, dass sich dies vom Import von IFolderItemsViewExtension unterscheidet, den Sie angezeigt haben.

Meine Vermutung ist, dass das Problem nicht ist, dass Sie mehrere IFolderItemsVIEWExtensions haben, aber dass Sie mehrere IFolderViewExtensions haben, oder es gibt einen anderen Vertrag, den Sie mit mehr als einem verwenden, der genau einen benötigt.

Dies kann verursacht werden, weil Sie dieselbe Assembly in mehr als einem Ihrer Verzeichniskataloge haben. Dies ist leicht möglich, wenn Sie einen Verweis auf eine Assembly haben und copy local auf true gesetzt ist.

+1

Daniel ist wahrscheinlich hier; Vergessen Sie nicht, dass es einige Wege gibt, um MEF-Probleme zu debuggen als Trial-and-Error. Sie sollten den Kompositionszustand wahrscheinlich wie hier beschrieben ablegen http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&referringTitle=Guide –

+0

Danke für die Hilfe. Ich fing an, die Importe von den Kontrollen zu entfernen, die selbst Exporte waren und alles funktioniert. Ich habe die Importe wieder eingefügt und kann das ursprüngliche Problem jetzt nicht reproduzieren. Bottom-Line obwohl ... es funktioniert jetzt. Danke Daniel und Nicholas. Ich bin gerade dabei, meine Füße auf MEF zu bekommen und bin überwältigt von der Kraft und dem Potenzial für vollständig erweiterbare Anwendungen auf dem Desktop. – user120985

+0

Vielen Dank ... mein Problem gelöst –

0

Ich schätze, dass mehr als eine Exportanweisung in Ihrer Exportklasse enthalten sein kann. Ich war mit dem gleichen Problem konfrontiert und das löste sich, als ich alle anderen Expertenaussagen aus dieser Exportklasse entfernte. und jetzt funktioniert es gut.

Verwandte Themen