Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t加载多个MEF零件_C#_Winforms_Mef - Fatal编程技术网

C# Can';t加载多个MEF零件

C# Can';t加载多个MEF零件,c#,winforms,mef,C#,Winforms,Mef,我有一个Winforms桌面应用程序,它正在加载具有相同接口类型的多个MEF部件 问题: 当我尝试加载多个相同类型时,会出现以下异常: 组成保持不变。由于以下错误,更改被拒绝:合成产生了一个合成错误。下面提供了根本原因。有关详细信息,请查看CompositionException.Errors属性 1) 未找到与约束“((exportDefinition.ContractName=“BOCA.TaskPilot.Common.Extensions.ifolderiveExtension”)&&&

我有一个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

以下是加载部件的代码:

            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一周,它的强大功能和桌面上完全可扩展的应用程序的潜力让我大吃一惊。