如何调试MEF异常?

时间:2011-11-30 10:16:43

标签: mef

我们目前正在使用MEF(托管扩展框架,http://mef.codeplex.com/),它会抛出异常,但有限的信息仍在继续。

有没有办法调试MEF异常?

我的例外是这样的:



System.Reflection.ReflectionTypeLoadException:无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。

在System.Reflection.RuntimeModule.GetTypes(RuntimeModule模块)

在System.Reflection.RuntimeModule.GetTypes()

在System.Reflection.Assembly.GetTypes()

在System.ComponentModel.Composition.Hosting.AssemblyCatalog.get_InnerCatalog()

在System.ComponentModel.Composition.Hosting.AssemblyCatalog.GetExports(ImportDefinition definition)

在System.ComponentModel.Composition.Hosting.AggregateCatalog.GetExports(ImportDefinition definition)

在System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExportsCore(ImportDefinition definition,AtomicComposition atomicComposition)

在System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore(ImportDefinition定义,AtomicComposition atomicComposition,IEnumerable`1& exports)

at System.ComponentModel.Composition.Hosting.AggregateExportProvider.GetExportsCore(ImportDefinition definition,AtomicComposition atomicComposition)

在System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore(ImportDefinition定义,AtomicComposition atomicComposition,IEnumerable`1& exports)

在System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExports(ImportDefinition定义,AtomicComposition atomicComposition,IEnumerable`1& exports)

在System.ComponentModel.Composition.Hosting.CompositionContainer.GetExportsCore(ImportDefinition定义,AtomicComposition atomicComposition)

在System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore(ImportDefinition定义,AtomicComposition atomicComposition,IEnumerable`1& exports)

在System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition定义,AtomicComposition atomicComposition)

at System.ComponentModel.Composition.Hosting.ImportEngine.TryGetExports(ExportProvider provider,ComposablePart part,ImportDefinition definition,AtomicComposition atomicComposition)

at System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportSubset(PartManager partManager,IEnumerable`1 imports,AtomicComposition atomicComposition)

在System.ComponentModel.Composition.Hosting.ImportEngine.TryPreviewImportsStateMachine(PartManager partManager,ComposablePart part,AtomicComposition atomicComposition)

在System.ComponentModel.Composition.Hosting.ImportEngine.PreviewImports(ComposablePart part,AtomicComposition atomicComposition)

在System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.Compose(CompositionBatch batch)

在System.ComponentModel.Composition.Hosting.CompositionContainer.Compose(CompositionBatch batch)

在System.ComponentModel.Composition.AttributedModelServices.ComposeParts(CompositionContainer容器,Object [] attributesParts)

位于W:\ MyApp \ Source \ Extensions \ Extension.cs中的MyApp.Extension..ctor(程序集程序集):第45行

确定

守则很简单:

var aggregateCatalog = new AggregateCatalog();
_assembly = assembly;
var assemblyCatalog = new AssemblyCatalog(assembly);
aggregateCatalog.Catalogs.Add(new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly()));
aggregateCatalog.Catalogs.Add(assemblyCatalog);
_compositionContainer = new CompositionContainer(aggregateCatalog);
_compositionContainer.ComposeParts(this);

2 个答案:

答案 0 :(得分:9)

feel your pain。当我遇到困难时,我通常会转储MEF组成信息,以获取有关组合失败原因的更多信息。有关如何执行此操作的说明,请参阅MEF编程指南中的Diagnosing Composition Problems或MSDN上的Debugging MEF主题。

在.NET 4.5(或Codeplex上可用的当前MEF 2预览版4)中,有一个更简单的选项:您可以通过在传递给CompositionOptions的{{3}}中禁用静默拒绝来提高错误消息的实用性容器构造函数。

编辑:啊,你得到的是ReflectionTypeLoadException。这是另一回事:它意味着某些程序集中的类型无法成功加载,通常是因为它们引用了无法找到的其他类型。在您的代码示例中,您应该能够通过调用assembly.GetTypes()来重现该问题,而不涉及MEF。

答案 1 :(得分:3)

Daniel Plaisted撰写了一篇关于MEF诊断问题的深入blog article

你能告诉我们抛出什么异常吗?