как отладить MEF исключение? - PullRequest
5 голосов
/ 30 ноября 2011

в настоящее время мы используем MEF (Managed Extensibility Framework, 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)

в System.ComponentModel.Composition.Hosting.AggregateCatalog.GetExports (определение ImportDefinition)

в System.ComponentModel.Composition.Hosting.CatalogExportProvider.GetExportsCore (определение ImportDefinition, AtomicComposition atomicComposition)

в System.ComponentModel.Composition.Hosting.ExportProvider.TryGetExportsCore (определение ImportDefinition, AtomicComposition atomicComposition, IEnumerable`1 & exports)

в System.ComponentModel.Composition.Hosting.AggregateExportProvider.GetExportsCore (определение ImportDefinition, 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)

в System.ComponentModel.Composition.Hosting.ImportEngine.TryGetExports (поставщик ExportProvider, часть ComposablePart, определение ImportDefinition, AtomicComposition atomicComposition)

в System.ComponentModel.Composition.Hosting.ImportEngine.TrySatisfyImportSubset (PartManager partManager, импорт IEnumerable`1, AtomicComposition atomicComposition)

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

в System.ComponentModel.Composition.Hosting.ImportEngine.PreviewImports (часть ComposablePart, AtomicComposition atomicComposition)

в System.ComponentModel.Composition.Hosting.ComposablePartExportProvider.Compose (пакетная композиция)

в System.ComponentModel.Composition.Hosting.CompositionContainer.Compose (партия CompositionBatch)

в System.ComponentModel.Composition.AttributedModelServices.ComposeParts (контейнер CompositionContainer, Object [] attribuParts)

в MyApp.Extension..ctor (сборка сборки) в W: \ MyApp \ Source \ Extensions \ Extension.cs: строка 45

OK

Код прост:

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 ]

9 голосов
/ 30 ноября 2011

Я чувствую вашу боль .Когда я застреваю, я обычно сбрасываю информацию о составе MEF, чтобы получить больше информации о причине сбоя композиции.Инструкции о том, как это сделать, см. В Диагностика проблем с композицией в Руководстве по программированию MEF или в разделе Отладка MEF в MSDN.

В .NET 4.5 (или текущем выпуске MEF 2 preview 4, доступном в codeplex) есть более простая опция: вы можете повысить полезность сообщения об ошибке, отключив тихий отказ в CompositionOptions который вы передаете конструктору контейнера.

edit : ах, вы получаете ReflectionTypeLoadException.Другое дело: это означает, что типы в некоторой сборке не могут быть успешно загружены, как правило, потому что они ссылаются на другие типы, которые не могут быть найдены.В вашем примере кода вы сможете воспроизвести проблему, вызвав assembly.GetTypes(), без участия MEF.

3 голосов
/ 30 ноября 2011

Даниэль Плейстед написал довольно подробную статью в блоге о диагностике проблем с MEF.

Можете ли вы показать нам, какие исключения выдают?

...