1

提前感谢你的帮助。我有以下导出的部分:

[Export (typeof(INewComponent))]  // orignally tried just [Export} here and importing NewComponent below
public class NewComponent : INewComponent  
{  
    // does stuff including an import  
}

控制台测试程序导入以上内容:

public class Program   
{    

    [Import]  // have tried variations on importing "NewComponent NewComponent" etc  
    public INewComponent NewComponent
    {
        get;
        set;
    }

    public static void Main(string[] args)
    {
        var p = new Program();
        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        var container = new CompositionContainer(catalog);
        container.ComposeParts(p);
}

组合因这些组合异常而失败(我删除了命名空间以保护有罪:)):

1) 没有找到与约束匹配的有效导出 '((exportDefinition.ContractName == "INewComponent") AndAlso (exportDefinition.Metadata.ContainsKey("ExportTypeIdentity") AndAlso "INewComponent".Equals(exportDefinition.Metadata.get_Item("ExportTypeIdentity) "))))',无效的导出可能已被拒绝。

如果我像这样在主程序中进行组合,则组合可以成功运行:

public class Program  
{      

    public static void Main(string[] args)
    {
        INewComponent newComponent = new NewComponent();

        var catalog = new AssemblyCatalog(typeof(Program).Assembly);
        var container = new CompositionContainer(catalog);
        container.ComposeParts(newComponent);
    }
}

谢谢你

4

2 回答 2

3

您的导出零件是否包含在同一个装配体中Program?如果它位于单独的 DLL 中,则还需要将该程序集包含在目录中,如下所示:

var aggregateCatalog = new AggregateCatalog();
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(typeof(NewComponent).Assembly));
var container = new CompositionContainer(aggregateCatalog);
// etc...

如果这不起作用,那么有一个名为 Visual MEFx 的不错的开源工具可以帮助您分析您的目录。这是一篇关于设置的简短文章:

Visual MEFx 入门

于 2012-06-25T13:03:26.983 回答
2

在您的NewComponent课堂上,您写道:

// does stuff including an import

如果该未显示的导入存在问题,则 MEF 将抱怨Program.NewComponent导入而不是实际的更深层次的原因。这被称为“稳定的组合”。稳定的组合可能很有用,但它也会使失败组合的调试变得复杂

您可以按照 MEF 文档中有关诊断组合错误的说明来了解实际原因。

在一个小程序中,您还可以尝试调用container.GetExportedValue<ISomeExport>()一些导出,直到找到导致问题的导出。

于 2012-06-25T13:21:06.603 回答