[英]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.