2009-12-28 13 views
7

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.

Odpowiedz

4

Błąd wskazuje, że nie można znaleźć eksportu typu IFolderViewExtension. Zauważ, że różni się od importu pokazanego IFolderItemsViewExtension.

Domyślam się, że problem nie polega na tym, że masz wiele IFolderItemsViewExtensions, ale masz wiele IFolderViewExtensions, lub jest jakaś inna umowa, której używasz więcej niż jeden z importowaniem, który wymaga dokładnie jednego.

Może to być spowodowane tym, że masz ten sam zestaw w więcej niż jednym katalogu katalogów. Jest to łatwe, jeśli masz odniesienie do złożenia, a kopia lokalna jest ustawiona na true.

+1

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 –

+0

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

+0

Wielkie dzięki ... rozwiązałem mój problem –

0

Możliwe, że w twojej klasie eksportu może znajdować się więcej niż jedno polecenie eksportu. Miałem do czynienia z tym samym problemem i to rozwiązało się, gdy usunąłem wszystkie inne wyciągi ekspertów z tej klasy eksportu. a teraz działa dobrze.

Powiązane problemy