3

我有一个奇怪的 MEF 问题,我在一个测试项目中对此进行了测试,一切似乎都运行良好,但由于某种原因无法在实际项目中运行

这是导出代码

    public void RegisterComponents()
    {

        _registrationBuilder = new RegistrationBuilder();
         _registrationBuilder
            .ForTypesDerivedFrom(typeof(MyType))
            .SetCreationPolicy(CreationPolicy.NonShared)
            .Export();

        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(MyType).Assembly, _registrationBuilder));


        var directoryCatalog = new DirectoryCatalog(PathToMyTypeDerived, _registrationBuilder);
        catalog.Catalogs.Add(directoryCatalog);

        _compositionContainer = new CompositionContainer(catalog);
        _compositionContainer.ComposeParts();

        var exports = _compositionContainer.GetExportedValues<MyType>();
        Console.WriteLine("{0} exports in AppDomain {1}", exports.Count(), AppDomain.CurrentDomain.FriendlyName);
    }

出口计数为 0 :( 任何想法为什么?

在日志文件中我有很多这样的

System.ComponentModel.Composition 信息:6:ComposablePartDefinition 'SomeOthertype' 被忽略,因为它不包含导出。

虽然我认为这没关系,因为我对导出 'someOtherType' 不感兴趣

更新:我找到了这个链接,但在调试之后我并不聪明,但也许我没有正确跟进。

感谢您的任何指点

干杯

4

1 回答 1

3

我只是遇到了同样的问题,这篇文章对我帮助很大。

它描述了解析失败的不同原因。更重要的一个是您要解析的类型的依赖项的依赖项未注册。

对我帮助很大的是调试应用程序时写入输出窗口的跟踪输出。它准确描述了无法解析类型的原因。

即使有这个输出。你可能需要挖掘一点,因为我只深了一层。

例子:

我想解析 A 类,我收到这样的消息:

System.ComponentModel.Composition 警告:1:ComposablePartDefinition 'Namespace.A' 已被拒绝。组成保持不变。由于以下错误,更改被拒绝: 合成产生了多个合成错误,有 1 个根本原因。下面提供了根本原因。查看 CompositionException.Errors 属性以获取更多详细信息。

1) 未找到与约束匹配的导出:ContractName Namespace.IB RequiredTypeIdentity Namespace.IB

导致:无法在“命名空间 A”部分上设置导入“命名空间.A..ctor (Parameter="b", ContractName="namespace.IB")'。元素:Namespace.A..ctor (Parameter="b", ContractName="Namespace.IB") --> Namespace.A --> AssemblyCatalog (Assembly="assembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken =...")

但我清楚地看到了一部分Namespace.IB。所以,在调试器中,我试图解决那个问题。我得到了另一个跟踪输出。这次它告诉我,我的实现Namespace.IB无法解决,因为其中一个导入缺少导出,所以与上面的消息基本相同,只是类型不同。而这一次,我没有找到那个缺失的进口零件。现在我知道了,哪种类型是真正的问题,并弄清楚为什么没有注册。

于 2014-10-09T15:34:56.623 回答