Компонент MEF с [Экспорт] в расширении VS - Не найдено ни одного экспорта, соответствующего ограничению

В расширении Visual Studio я пытаюсь экспортировать компонент MEF и найти его позже.

У меня есть этот класс:

[Export(typeof(IBoilerplateSettings))]
public class BoilerplateSettings : IBoilerplateSettings
{
    ...

И этот код разрешить в обратном вызове от OleMenuCommand. Получил пример из этого запроса.

var componentModel = (IComponentModel)this.package.GetService(typeof(SComponentModel));
var settings = componentModel.DefaultExportProvider.GetExportedValue<IBoilerplateSettings>();

Но он выдает эту ошибку каждый раз:

No exports were found that match the constraint: 
    ContractName    UnitTestBoilerplate.IBoilerplateSettings
    RequiredTypeIdentity    UnitTestBoilerplate.IBoilerplateSettings

Оба находятся в одной сборке. Я попробовал [Export] атрибут в обоих System.Composition а также System.ComponentModel.Composition но ни одна из них не работает

Я смотрю документы для MEF в VS, но похоже, что добавление атрибута должно работать. Я также пытался очистить кэш ComponentModel, но это не сработало. Что мне здесь не хватает?

2 ответа

Решение

Как правило, две вещи, чтобы проверить:

  1. Убедитесь, что ваш проект упоминается как компонент MEF внутри вашего.vsixmanifest. Если это не так, VS не будет искать в вашей сборке.
  2. Если вы работаете в Visual Studio 2015 или более поздней версии, в папке ComponentModelCache есть файл.err, в котором перечислены ошибки при создании композиции MEF. Убедитесь, что то, что вам небезразлично, отсутствует там (Нормально иметь там дерьмо... мы не всегда лучше отправляем его в чистом виде.)

И если это не сработает, часто существует агрессивный метод, который заключается в том, чтобы просто разбить все исключения во время работы Visual Studio и посмотреть, сможете ли вы найти что-нибудь, связанное с вашим расширением. Вы можете найти другое исключение при загрузке или другую причину. К сожалению, это очень точный подход.

Спасибо, Джейсон Малиновски. Это очень важно. Если вы хотите использовать MEF в vsix. вам нужно обратить внимание на то, есть ли у ресурса в vsixmainfest соответствующий MefComponent.

Другие вопросы по тегам