Mam aplikację WinForm, która ładuje wiele elementów MEF z tym samym typem interfejsu.Nie można załadować wielu części MEF
Problem: Kiedy próbuję załadować więcej niż jeden z tego samego typu pojawia się następujący wyjątek:
Skład pozostaje niezmieniony. Zmiany zostały odrzucone z powodu następującego błędu: Kompozycja spowodowała pojedynczy błąd składu. Podstawowa przyczyna znajduje się poniżej. Przejrzyj właściwość CompositionException.Errors, aby uzyskać bardziej szczegółowe informacje.
1) Nie ważne eksport znaleziono pasujących ograniczenie „((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & &" BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))), nieprawidłowe wywozy mogły zostać odrzucone.
W wyniku: Nie można ustawić importu "TaskPilot.Windows.MainForm.FolderViewExtension (ContractName =" BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ")" na części "TaskPilot.Windows.MainForm". elementu: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm
tutaj jest oznaczeniem w celu załadowania części:
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);
Oto kod na klasy dla każdego z MEF części:
[Export(typeof(IFolderItemsViewExtension))
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification]
Oto importu stosowane w formularzu głównym:
[ImportMany(AllowRecomposition = true)]
private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null;
Jeśli odkomentuję ostatnią linię Catalog.Catalogs.Add, zgłasza wyjątek. Jeśli uruchomię to bez tego, to działa dobrze. Linia ta ładuje inny kontrolek użytkownika, który implementuje interfejs IFolderItemsViewExtension. Próbowałem po prostu załadować fałszywego projektu, że wszystko, co ma, to kontrola użytkownika i ten interfejs i nadal otrzymuję ten sam wyjątek. Bez względu na to, co robię, nadal otrzymuję ten wyjątek.
Wygląda na to, że wszystko działa poprawnie, o ile nie ładuję więcej niż jednego tego samego typu eksportu części MEF.
Używa najnowszej wersji 2009.22.10.0 z System.ComponentModel.Composistion z pobrania MEF.
Prawdopodobnie Daniel jest tu na miejscu; nie zapominaj, że istnieją aster sposoby debugowania problemów z MEF niż prób i błędów. Powinieneś prawdopodobnie zrzucić stan kompozycji, jak opisano tutaj http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&referringTitle=Guide –
Dzięki za pomoc. Zacząłem usuwać import z kontrolek, które same eksportowały i wszystko działa. Przywracam Import i teraz nie mogę odtworzyć pierwotnego problemu na początek. Ostatecznie jednak ... teraz działa. Dzięki Daniel i Nicholas. Właśnie spędzam tydzień na MEF i jestem bardzo zdumiony jego mocą i potencjałem w pełni rozszerzalnych aplikacji na pulpicie. – user120985
Wielkie dzięki ... rozwiązałem mój problem –