簡體   English   中英

無法加載多個MEF部件

[英]Can't load multiple MEF parts

我有一個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'上設置導入'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]

這是Main表單上使用的Import:

[ImportMany(AllowRecomposition = true)]
    private IEnumerable<IFolderItemsViewExtension> TaskViewExtensions = null;

如果我取消注釋最后一個Catalog.Catalogs.Add行,則會拋出異常。 如果我沒有它運行它運行得很好。 該行加載實現IFolderItemsViewExtension接口的不同用戶控件。 我試圖加載一個虛擬項目,它擁有的只是用戶控件和該接口,我仍然得到相同的異常。 無論我做什么,我仍然會得到這個例外。

似乎一切都運行良好,只要我沒有加載多個相同類型的MEF部件導出。

這是使用MEF下載的System.ComponentModel.Composistion的最新版本2009.22.10.0。

該錯誤表明它找不到IFolderViewExtension類型的導出。 請注意,這與您顯示的IFolderItemsViewExtension的導入不同。

我的猜測是問題不是你有多個IFolderItemsViewExtensions,而是你有多個IFolderViewExtensions,或者你有一些其他合同,你使用的導入只需要一個。

這可能是因為您在多個目錄編目中具有相同的程序集。 如果您具有對程序集的引用並且將local local設置為true,則很容易發生這種情況。

我猜你的Export類可能有多個導出語句。 我遇到了同樣的問題,當我從該導出類中刪除了所有其他專家聲明時,這就解決了。 現在它工作正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM