У меня есть настольное приложение Winforms, которое загружает несколько частей MEF с одним и тем же типом интерфейса.
Проблема: когда я пытаюсь загрузить более одного экземпляра одного и того же типа, я получаю следующее исключение:
Состав остается неизменным. Изменения были отклонены из-за следующих ошибок: при композиции возникла единственная ошибка композиции. Основная причина указана ниже. Просмотрите свойство CompositionException.Errors для получения более подробной информации.
1) Не обнаружено ни одного действительного экспорта, соответствующего ограничению '((exportDefinition.ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") && (exportDefinition.Metadata.ContainsKey ("ExportTypeIdentity") && "BOCA.TaskPilot.Common. Extensions.IFolderViewExtension ".Equals (exportDefinition.Metadata.get_Item (" ExportTypeIdentity ")))) ', недопустимый экспорт мог быть отклонен.
Результат: Невозможно установить импорт «TaskPilot.Windows.MainForm.FolderViewExtension (ContractName =" BOCA.TaskPilot.Common.Extensions.IFolderViewExtension ")» в части «TaskPilot.Windows.MainForm». Элемент: TaskPilot.Windows.MainForm.FolderViewExtension (ContractName = "BOCA.TaskPilot.Common.Extensions.IFolderViewExtension") -> TaskPilot.Windows.MainForm
Вот код для загрузки деталей:
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);
Вот код класса для каждой части MEF:
[Export(typeof(IFolderItemsViewExtension))
public partial class TaskTreeView : DevExpress.XtraEditors.XtraUserControl, IFolderItemsViewExtension, IPartImportsSatisfiedNotification]
Вот импорт, используемый в основной форме:
[ImportMany(AllowRecomposition = true)]
private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null;
Если я раскомментирую последнюю строку Catalog.Catalogs.Add, она выдаст исключение. Если я запустил его без этого, он будет работать нормально. Эта строка загружает другой пользовательский элемент управления, реализующий интерфейс IFolderItemsViewExtension. Я попытался просто загрузить фиктивный проект, в котором все, что у него есть, - это пользовательский элемент управления и этот интерфейс, и я все еще получаю то же исключение. Независимо от того, что я делаю, я все равно получаю это исключение.
Кажется, что все работает нормально, пока я не загружаю более одного экземпляра MEF одного типа.
Используется последняя версия 2009.22.10.0 System.ComponentModel.Composistion из загрузки MEF.