我们目前正在使用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)
守则很简单:
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);
答案 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。
你能告诉我们抛出什么异常吗?