C# MEF Composition ImportMany生成同一类的两个版本

C# MEF Composition ImportMany生成同一类的两个版本,c#,.net,mef,C#,.net,Mef,我还没能找到我问题的答案。我使用MEF查找并创建实现IPlugIn的类,但最终每个插件类都有两个版本。我已经确定AggregateCatalog只包含一个程序集,其中每个类只包含一种类型作为一个部分,但我仍然得到每个类的两个实例作为最终结果。我可能只是做了些傻事,但我还没找到。我很感激任何帮助 ... [ImportMany(typeof(IPlugIn))] public System.Lazy>[] Plugins { get; set; } ... //agg

我还没能找到我问题的答案。我使用MEF查找并创建实现IPlugIn的类,但最终每个插件类都有两个版本。我已经确定AggregateCatalog只包含一个程序集,其中每个类只包含一种类型作为一个部分,但我仍然得到每个类的两个实例作为最终结果。我可能只是做了些傻事,但我还没找到。我很感激任何帮助

... [ImportMany(typeof(IPlugIn))] public System.Lazy>[] Plugins { get; set; } ... //aggregatecatalog only contains one dll containing plugin classes, 4 of them container = new CompositionContainer(aggregateCatalog, CompositionOptions.DisableSilentRejection | CompositionOptions.IsThreadSafe);\ container.SatisfyImportsOnce(this); ... public void StartAll() { //We have 8 PlugIns here?? How? if (Plugins == null || Plugins.Count() == 0) { log.Warn("No PlugIns Available to Start!"); return; } foreach (var plug in Plugins) { log.Info("Starting PlugIn: " + plug.Value.GetName()); plug.Value.Start(); } } ... [Export(typeof(IPlugIn))] public class MyPlugIn : BasePlugIn, IPlugIn ... ... [进口数量(类型(IPlugIn))] public System.Lazy>[]插件{get;set;} ... //aggregatecatalog只包含一个包含插件类的dll,其中有4个 容器=新的合成容器(aggregateCatalog, 合成选项。不可禁用输入 |合成选项。IsThreadSafe)\ 集装箱。满足进口(本); ... 公共图书馆 { //我们这里有8个插件??如何? if(Plugins==null | | Plugins.Count()==0) { log.Warn(“没有可启动的插件!”); 返回; } foreach(var插件) { log.Info(“启动插件:+plug.Value.GetName()); plug.Value.Start(); } } ... [导出(类型(IPlugIn))] 公共类MyPlugIn:BasePlugIn,IPlugIn ...
我正在Visual Studio中调试。我清楚地看到只有一个组件加载。CompositionContainer每个容器只有一个。在StartAll()中满足importon之后,我有两个IPlugIn类的实例。这与我使用ImportMany的方式有关吗?我愿意接受任何想法

解决方案原来很简单。我从IPlugIn接口中完全删除了[InheritedExport],这创建了正确数量的插件。如果我删除了[导出…从每个插件子类中,我没有得到任何插件。正是这两个插件的组合创建了多个实例。

如果界面上有
InheritedExport
属性,则必须在实现该接口的类上使用
InheritedExport
。应用
Export
会产生广告其他部分正在组成,这是你发现的


此外,如果要将任何其他
ExportMetadata
应用于实现了
InheritedExport
接口的类,则必须再次添加
InheritedExport
属性以添加元数据(即使没有继承的元数据,也要替换继承的元数据)。这在或的MSDN文档中没有提到,但我在其他晦涩的Microsoft文档中遇到了一些模糊的引用。

您的导出是什么样子的?当我的导出语句设置不正确时,我就遇到了这种情况。我添加了一个导出示例。您看到它有任何问题吗?首先,您的BasePlugIn和IPlugIn没有
Export
标签,是吗?接下来,您可以尝试从
Export
ImportMany
中删除
typeof(IPlugIn)
。不知道为什么会有帮助,但我注意到我的
Export
ImportMany
上没有这个标签。尝试替换container.SatisfyImportsOnce(这个)使用container.ComposeParts(此).我不熟悉SutisfyImportSonce,但我一直在importmany中使用ComposeParts。我以前尝试过ComposeParts,但仍然是同一个问题。我应该提到这一点。没有BasePlugIn和IPlugIn没有导出。删除typeof没有任何效果。每个类我仍然有两个实例…奇怪的东西…还有其他想法吗?