Possiedo un'applicazione desktop Winforms che carica più parti MEF con lo stesso tipo di interfaccia.Impossibile caricare più parti MEF
Problema: Quando provo a caricare più di uno stesso tipo ottengo la seguente eccezione:
La composizione rimane invariata. Le modifiche sono state rifiutate a causa dei seguenti errori: La composizione ha prodotto un singolo errore di composizione. La causa principale è fornita di seguito. Rivedere la proprietà CompositionException.Errors per informazioni più dettagliate.
1) Non ci sono esportazioni validi sono stati trovati che corrispondono il vincolo '((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & & " BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity "))))", le esportazioni non valide potrebbero essere state respinte.
Con conseguente: non è possibile impostare l'importazione 'TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension")' da parte 'TaskPilot.Windows.MainForm'. Elemento: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm
Ecco il codice per caricare le parti:
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);
Ecco il codice alla classe per ciascuna delle parti MEF:
[Export(typeof(IFolderItemsViewExtension))
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification]
Ecco l'Importa utilizzato nella maschera principale:
[ImportMany(AllowRecomposition = true)]
private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null;
Se annullo l'ultima riga Catalog.Catalogs.Add, genera l'eccezione. Se lo eseguo senza che funzioni bene. Quella riga carica un controllo utente diverso che implementa l'Interfaccia IFolderItemsViewExtension. Ho provato a caricare un progetto fittizio che tutto ciò che ha è il controllo utente e quell'interfaccia e ho ancora la stessa eccezione. Non importa quello che faccio, ottengo comunque questa eccezione.
Sembra che tutto vada bene fino a quando non carico più di uno dello stesso tipo di esportazione parte MEF.
Si sta utilizzando l'ultima versione di 2009.22.10.0 di System.ComponentModel.Composistion dal download MEF.
Daniel probabilmente si trova qui; non dimenticare che esistono dei metodi aster per eseguire il debug dei problemi MEF piuttosto che tentativi ed errori. Probabilmente dovresti scaricare lo stato della composizione come descritto qui http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&referringTitle=Guide –
Grazie per l'aiuto. Ho iniziato a rimuovere le importazioni dai controlli che erano essi stessi esportati e tutto funziona. Inserisco nuovamente le importazioni e ora non riesco a riprodurre il problema originale per cominciare. In conclusione, però ... funziona ora. Grazie Daniele e Nicola. Sono appena tornato in piedi sulla MEF e sono molto sconvolto dalla sua potenza e potenziale per le applicazioni completamente estensibili sul desktop. – user120985
Grazie mille ... ho risolto il mio problema –