Создание нового типа с помощью MEF

Я использую CompositionInitializer.SatisfyImports(this) из Glen Block с приложением WPF, использующим Prism 4.1 и Prism. MEFРасширения.

Я использовал это много раз раньше, и у меня не было проблем, но время от времени, когда я вызываю SatisfyImports(this) и получаю следующую ошибку:

В mscorlib.dll возникло первое случайное исключение типа «System.Resources.MissingManifestResourceException». Дополнительные сведения: не удалось найти ресурсы, соответствующие указанной культуре или нейтральной культуре. Убедитесь, что «System.ComponentModel.Composition.Initialization.Strings.resources» был правильно встроен или связан со сборкой «Microsoft.ComponentModel.Composition.Initialization.Desktop» во время компиляции или что все необходимые вспомогательные сборки загружаемы и полностью подписаны. Если есть обработчик этого исключения, программа может быть безопасно продолжена.

Кто-нибудь знает, почему я получаю эту ошибку и как ее исправить?


person Nicros    schedule 19.12.2013    source источник
comment
возможный дубликат C#: что означает MissingManifestResourceException и как исправить?   -  person Adi Lester    schedule 26.12.2013
comment
@AdiLester Это не решение этой конкретной проблемы. Это ошибка, сгенерированная MEF, и, хотя сама ошибка кажется похожей, решение в другом вопросе не работает.   -  person Nicros    schedule 01.01.2014


Ответы (1)


Подход CompositionInitializer в некоторых случаях не работает с WPF, о чем свидетельствует вышеприведенное исключение MissingManifestResourceException — в основном, я думаю, это говорит о том, что один из импортов завершается сбоем из-за какой-то проблемы с ресурсами импортированной DLL... что вы можете или может не иметь никакого контроля.

Лучшим подходом (я думаю) является использование MEF ExportFactory для создания экземпляров объектов для приложений WPF. а не CompositionInitializer:

[Export]
public class OrderController {

  [Import] 
  public ExportFactory<OrderViewModel> OrderVMFactory {get;set;}

  public OrderViewModel CreateOrder() {
    return OrderVMFactory.CreateExport().Value;
  }
}

Во всяком случае, сработало для меня.

У меня есть несколько вопросов об управлении памятью и экспортной фабрике, но это уже другой пост :)

person Nicros    schedule 31.12.2013