同じインターフェイス タイプの複数の MEF パーツをロードしている Winforms デスクトップ アプリケーションがあります。
問題: 同じタイプのものを複数ロードしようとすると、次の例外が発生します。
構成は相変わらず。次のエラーのため、変更は拒否されました: 構成で 1 つの構成エラーが発生しました。根本的な原因を以下に示します。詳細については、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' でインポート 'TaskPilot.Windows.MainForm.FolderViewExtension (ContractName="BOCA.TaskPilot.Common.Extensions.IFolderViewExtension")' を設定できません。要素: 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 パーツ エクスポートを複数ロードしていない限り、すべて正常に動作しているようです。
これは、MEF ダウンロードからの System.ComponentModel.Comsistion の 2009.22.10.0 の最新バージョンを使用しています。