Компонент 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 ответа
Как правило, две вещи, чтобы проверить:
- Убедитесь, что ваш проект упоминается как компонент MEF внутри вашего.vsixmanifest. Если это не так, VS не будет искать в вашей сборке.
- Если вы работаете в Visual Studio 2015 или более поздней версии, в папке ComponentModelCache есть файл.err, в котором перечислены ошибки при создании композиции MEF. Убедитесь, что то, что вам небезразлично, отсутствует там (Нормально иметь там дерьмо... мы не всегда лучше отправляем его в чистом виде.)
И если это не сработает, часто существует агрессивный метод, который заключается в том, чтобы просто разбить все исключения во время работы Visual Studio и посмотреть, сможете ли вы найти что-нибудь, связанное с вашим расширением. Вы можете найти другое исключение при загрузке или другую причину. К сожалению, это очень точный подход.
Спасибо, Джейсон Малиновски. Это очень важно. Если вы хотите использовать MEF в vsix. вам нужно обратить внимание на то, есть ли у ресурса в vsixmainfest соответствующий MefComponent.