我有一个奇怪的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,但在对其进行调整后我并不明智,但也许我没有正确跟进。
感谢您的任何指示
干杯
答案 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
的实现无法解决,因为其中一个导入导致缺少导出,所以基本上与上面的消息相同,只是使用不同的类型。而这一次,我没有找到丢失导入的部分。现在我知道,哪种类型是真正的问题,并弄清楚,为什么没有注册它。