GetExportedValues <mytype>什么都不返回,我可以看到部件</mytype>

时间:2014-01-20 15:16:04

标签: mef system.componentmodel

我有一个奇怪的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'

更新:我发现了这个link,但在对其进行调整后我并不明智,但也许我没有正确跟进。

感谢您的任何指示

干杯

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,this article给了我很多帮助。

它描述了解决方案失败的不同原因。其中一个更重要的是,未注册要解析的类型的依赖关系。

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

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

示例:

我想解决A类问题,我收到了这样的消息:

  

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

     

1)没有找到符合约束条件的导出:       ContractName Namespace.IB       RequiredTypeIdentity Namespace.IB

     

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

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