Tengo una aplicación de escritorio Winforms que está cargando varias piezas MEF con el mismo tipo de interfaz.No se pueden cargar varias piezas MEF
Problema: Cuando intento cargar más de uno del mismo tipo me sale el siguiente excepción:
La composición se mantiene sin cambios. Los cambios fueron rechazados debido a los siguientes errores: la composición produjo un solo error de composición. La causa raíz se proporciona a continuación. Revise la propiedad CompositionException.Errors para obtener información más detallada.
1) No se encontraron exportaciones válidos que coincide con la restricción '((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") & & (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") & & " BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))) ', es posible que se hayan rechazado las exportaciones no válidas.
Como resultado: No se puede establecer la importación 'TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension")' en la parte 'TaskPilot.Windows.MainForm'. Elemento: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm
Aquí está el código para cargar las piezas:
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);
Aquí está el código de la clase para cada una de las partes del MEF:
[Export(typeof(IFolderItemsViewExtension))
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification]
Aquí está la importación utilizados en el formulario principal:
[ImportMany(AllowRecomposition = true)]
private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null;
Si elimino el comentario de la última línea de Catalog.Catalogs.Add arroja la excepción. Si lo ejecuto sin eso funciona bien. Esa línea carga un control de usuario diferente que implementa la interfaz IFolderItemsViewExtension. Intenté simplemente cargar un proyecto falso que todo lo que tiene es el control del usuario y esa interfaz, y aún recibo la misma excepción. No importa lo que haga, aún recibo esta excepción.
Parece que todo funciona bien siempre y cuando no estoy de cargar más de uno del mismo tipo de pieza de exportación MEF.
Se trata de utilizar la última versión del 2009.22.10.0 del System.ComponentModel.Composistion de la descarga MEF.
Daniel es probablemente un lugar aquí; no olvide que hay formas más avanzadas para depurar problemas MEF que prueba y error. Probablemente deberías volcar el estado de composición como se describe aquí http://mef.codeplex.com/wikipage?title=Debugging%20and%20Diagnostics&referringTitle=Guide –
Gracias por la ayuda. Empecé a eliminar las Importaciones de los controles que ellos mismos exportaban y todo funciona. Volví a colocar las importaciones y ahora no puedo reproducir el problema original. En resumidas cuentas ... funciona ahora. Gracias Daniel y Nicholas. Ahora estoy obteniendo la mejor semana en MEF y estoy impresionado por su poder y potencial para aplicaciones totalmente extensibles en el escritorio. – user120985
Muchas gracias ... resolvió mi problema –