C# Can';t加载多个MEF零件
我有一个Winforms桌面应用程序,它正在加载具有相同接口类型的多个MEF部件 问题: 当我尝试加载多个相同类型时,会出现以下异常: 组成保持不变。由于以下错误,更改被拒绝:合成产生了一个合成错误。下面提供了根本原因。有关详细信息,请查看CompositionException.Errors属性 1) 未找到与约束“((exportDefinition.ContractName=“BOCA.TaskPilot.Common.Extensions.ifolderiveExtension”)&&&(exportDefinition.Metadata.ContainsKey(“ExportTypeIdentity”)&&“BOCA.TaskPilot.Common.Extensions.ifolderiveExtension.Equals(exportDefinition.Metadata.get_项(“ExportTypeIdentity”))”匹配的有效导出,无效的导出可能已被拒绝 导致:无法在“TaskPilot.Windows.MainForm”部分上设置导入“TaskPilot.Windows.FolderViewExtension(ContractName=“BOCA.TaskPilot.Common.Extensions.IfoldServiceExtension”)”。 元素:TaskPilot.Windows.MainForm.FolderViewExtension(ContractName=“BOCA.TaskPilot.Common.Extensions.IFolderViewExtension”)-->TaskPilot.Windows.MainForm 以下是加载部件的代码:C# Can';t加载多个MEF零件,c#,winforms,mef,C#,Winforms,Mef,我有一个Winforms桌面应用程序,它正在加载具有相同接口类型的多个MEF部件 问题: 当我尝试加载多个相同类型时,会出现以下异常: 组成保持不变。由于以下错误,更改被拒绝:合成产生了一个合成错误。下面提供了根本原因。有关详细信息,请查看CompositionException.Errors属性 1) 未找到与约束“((exportDefinition.ContractName=“BOCA.TaskPilot.Common.Extensions.ifolderiveExtension”)&&&
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;
[ImportMany(AllowRecomposition=true)]
私有IEnumerable TaskViewExtensions=null;
如果取消对最后一行Catalog.Catalogs.Add的注释,则会引发异常。如果我不这样做的话,它运行的很好。该行加载实现IFolderItemsViewExtension接口的不同用户控件。我试着加载一个虚拟项目,它只有用户控件和界面,我仍然得到相同的异常。不管我做什么,我还是会得到这个例外
只要我不加载多个相同类型的MEF零件导出,似乎一切都正常
这使用的是MEF下载的System.ComponentModel.Composis的最新版本2009.22.10.0。该错误表明它找不到IfoldServiceExtension类型的导出。请注意,这与您所显示的IFolderItemsViewExtension的导入不同 我的猜测是,问题不在于您有多个IFolderItemsViewExtensions,而在于您有多个IFolderServiceExtensions,或者您有一个以上的其他契约,用于一个需要一个的导入
这可能是因为在多个目录目录目录中有相同的程序集。如果有对程序集的引用,并且“复制本地”设置为true,则很容易发生这种情况。我猜您的导出类中可能有多个导出语句。
我面临着同样的问题,当我从导出类中删除所有其他专家声明时,这个问题就解决了。现在它运行良好。丹尼尔可能就在这里;别忘了,调试MEF问题有很多方法,而不是反复试验。您可能应该像这里描述的那样转储合成状态,谢谢您的帮助。我开始从控件中删除导入,这些控件本身就是导出,一切正常。我把导入的东西放回去了,现在我无法重现最初的问题。但底线是,它现在起作用了。谢谢丹尼尔和尼古拉斯。我刚刚开始接触MEF一周,它的强大功能和桌面上完全可扩展的应用程序的潜力让我大吃一惊。