2017-01-29 3 views
0

В расширении Visual Studio я пытаюсь экспортировать компонент MEF и находить его позже.Компонент MEF с [Экспорт] в расширении VS - экспорт не найден, который соответствует ограничению

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

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

И этот код, чтобы разрешить в функции обратного вызова из OleMenuCommand. Получил пример от this pull request.

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, но не работает.

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

ответ

0

Вообще две вещи, чтобы проверить:

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

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

+0

Я попытался добавить ' 'под Активы, но это, похоже, не помогло. Файл .err равен 0 байтам. – RandomEngy

+0

И просто проверка: если у вас есть несколько проектов, поставленных в том же .vsix, вы публикуете там правильный проект? В противном случае да, это выглядит правильно ... –

+0

В .vsix есть только один проект. – RandomEngy

Смежные вопросы