7

同じインターフェイス タイプの複数の 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 の最新バージョンを使用しています。

4

2 に答える 2

4

このエラーは、タイプ IFolderViewExtension のエクスポートが見つからないことを示しています。これは、示した IFolderItemsViewExtension のインポートとは異なることに注意してください。

私の推測では、問題は複数の IFolderItemsViewExtensions があることではなく、複数の IFolderViewExtensions があること、または正確に 1 つを必要とするインポートで使用している複数のコントラクトがあることです。

これは、複数のディレクトリ カタログに同じアセンブリがあるために発生する可能性があります。アセンブリへの参照があり、コピー ローカルが true に設定されている場合、これは簡単に発生します。

于 2009-12-28T19:54:20.823 に答える
0

Export クラスに複数の export ステートメントがあると思います。私は同じ問題に直面していましたが、そのエクスポート クラスから他のすべての専門家の声明を削除すると、これは解決しました。そして今、それはうまくいっています。

于 2013-01-25T06:57:03.267 に答える