Visual Studio 2010 MEF против MPF?

Я пытаюсь добавить новый язык программирования в Visual sudio 2010, и я немного запутался в выборе наилучшего подхода.

Я просмотрел MPF и нашел несколько примеров того, как сделать подсветку синтаксиса, подключить внешний анализатор и т. д., и это кажется довольно простым.

Затем я прочитал о чем-то под названием MEF и о том, что это новая модель расширяемости для Visual Studio. Я поиграл с этим, и у меня работает подсветка синтаксиса, следуя некоторым примерам. Теперь, с MEF, я потерялся в том, как я связываю свой синтаксический анализатор для своего языка, например, MPF с использованием ParseSource и т. д. Кстати, я использую ANTLR.

Является ли MEF только визуальными аспектами редактора, такими как выделение, украшения и т. д., или возможно/рекомендуется реализовать с ним языковые службы?

Из того, что я понял, MEF — это новый рекомендуемый подход, но кажется, что создать новый язык сложнее, чем с обычным MPF. Является ли MPF по-прежнему хорошим подходом?


person David James Ball    schedule 30.05.2012    source источник
comment
Один из лучших способов — изучить, как это делает текущий проект. Попробуйте взглянуть на IronPython и инструменты Python для Visual Studio, чтобы увидеть, как они добавляют поддержку языка python в VS.   -  person Alan Barber    schedule 31.05.2012
comment
На этот вопрос до сих пор отсутствует принятый ответ. Помог ли вам мой ответ или вам нужно больше деталей? =3   -  person Ray    schedule 01.07.2015
comment
Да, я забыл об этом, это было некоторое время назад. Ваш ответ был очень полезным, спасибо, и я пошел по маршруту MPF.   -  person David James Ball    schedule 02.07.2015


Ответы (3)


MEF (Managed Extensibility Framework) — это общий подход к программированию в .NET для расширения программ, таких как Visual Studio. Пакеты/расширения VS могут использовать более новые классы VS-MEF (контракты) вместо классов MPF. MEF распознается классами, имеющими атрибуты [Export]. Как правило, вы наследуете определенный класс, например раскрашиваемый элемент, и экспортируете его в Visual Studio, который затем ищет все экспорты в вашем пакете MEF и импортирует их.

MPF (инфраструктура управляемых пакетов) похожа на систему классов вокруг старых оболочек COM неуправляемой/собственной модели расширений VS. Вы программно расширяете Visual Studio, получая службы и реализуя методы классов MPF (классы MPF, в свою очередь, реализуют COM-подобные интерфейсы COM-оболочек VS. Например, LanguageService реализует IVsLanguageInfo и некоторые другие интерфейсы, но просто «собирает» методы того интерфейса, который вы затем можете переопределить в своем классе реализации LanguageService).

Если вы хотите реализовать полный язык программирования, вы будете комбинировать MPF и MEF. Вы используете MEF для частей редактора, таких как токенизация (которая необходима для подсветки синтаксиса), контуров, сопоставления фигурных скобок и т. д. и MPF для других вещей VS, таких как новые окна инструментов, страницы свойств и т. д.

Вместо MPF вы также можете использовать более старые оболочки COM, но классы MPF уже выполняют за вас некоторую работу COM, с которой вам придется иметь дело, если вы выберете оболочки COM.

Вы также можете реализовать токенизатор и т. д. с помощью MPF, но я попробовал и нашел его гораздо более неинтуитивным, чем MEF. Если вы спросите меня, это намного сложнее и требует большего повреждения мозга, чем MEF, но я еще не продвинулся с MEF так же далеко, как с MPF.

Это немного сбивает меня с толку, потому что MSDN смешивает статьи MEF и MPF, как я заметил. Нужно очень внимательно смотреть, в какой подраздел MSDN вы заходите, вы можете легко случайно переключиться с категории MEF на MPF. Однако MSDN подсказывает вам, что есть что, в некоторых общих статьях о расширении VS, например здесь: http://msdn.microsoft.com/en-us/library/cc138569.aspx

person Ray    schedule 16.06.2014
comment
nb относительно… классов MPF… реализуют COM-подобные интерфейсы [используемые с] LanguageService [который] реализует IVsLanguageInfo… Совсем недавно в vs2017 15.8 указанное вами конкретное использование было включено через МЭФ. Так глупо, как только я подумал, что они отказались от (по общему признанию, отчаянной) задачи по преобразованию полной устаревшей экосистемы VSIX в MEF — поскольку для случайного наблюдателя это казалось, что усилия были оставлены умирать на полпути - они, очевидно, продолжали сражаться. Отличный ответ. - person Glenn Slayden; 28.03.2019

В настоящее время я реализую языковую службу исключительно с MEF (в VS2013).

Помимо подсветки синтаксиса (которую вы можете сделать с помощью ITagger<ClassificationTag>) и нескольких других встроенных специализированных интерфейсов MEF (например, для страниц опций и различных типов intellisense), которые вы реализуете по мере необходимости, для таких вещей, как фоновый анализ вы обычно реализуете IVsTextViewCreationListener и делаете что-то, когда файл открыт; в качестве альтернативы вы можете просматривать иерархию проекта в фоновом режиме, используя метод Initialize вашего пакета в качестве точки входа.

Функции Intellisense и т. д. часто требуют от вас ответа на определенную команду (или отслеживания нажатий клавиш, чтобы узнать, когда, например, всплывающее окно со списком завершения); вы можете справиться с этим, реализуя IOleCommandTarget и обрабатывая соответствующие команды (вы подключаете свой обработчик команд вручную, вызывая AddCommandFilter на IVsTextView при создании текстового представления).

До сих пор я не сталкивался ни с чем, что я не мог бы сделать через MEF (за исключением того, что вообще нельзя сделать); Я никогда не смотрел в MPF, так как мне это не нужно.

(Обратите внимание, что, в конце концов, код имеет тенденцию напоминать суп из сантехники MEF, интерфейсов VS SDK и вспомогательных классов, а также EnvDTE goop.)

person Cameron    schedule 16.06.2014
comment
Для расширенных сценариев, которые явно не санкционированы MEF, вот хитрость: как только вы преобразуете свой ITextView в IWpfTextView, в его свойстве Properties будет анонимно храниться множество устаревших прокладок, подобно присоединенному свойству в стиле WPF. использование (т. е. нетипизированные пары ключ-значение). Большинство из них недоступны в декларативной модели атрибуции MEF. Вы можете подключить интересующие вас прокладки, подорвав их, т. Е. Заменив свой собственный обработчик в слот, а затем отложив (сохраненный) прежний, если / как / когда это уместно. - person Glenn Slayden; 28.03.2019
comment
@GlennSlayden Хороший совет. Нам еще не нужно было оборачивать ни один из них, но получение ITextDocument из свойств оказалось полезным. - person Cameron; 28.03.2019

Используйте MEF для функций, предоставляемых через MEF. Другие функции обрабатываются в каждом конкретном случае (задайте конкретный вопрос, если у вас возникли проблемы с реализацией конкретной функции). Единственное, для чего я до сих пор использую MPF, — это проектные системы (MPF for Projects или MPFProj). Чтобы справиться с фоновым синтаксическим анализом, я рекомендую взглянуть на мою реализацию BackgroundParser (лицензия MIT). Это работает довольно хорошо, хотя, оглядываясь назад, я хотел бы использовать для этого TPL и заставить ReParseImpl возвращать Task вместо синхронного выполнения.

  • BackgroundParser.cs
  • Commit 0d3e55e, показывающий введение и использование BackgroundParser и некоторых необходимых вспомогательных классов.
person Sam Harwell    schedule 16.06.2014
comment
... предупреждаю вас о моем комментарии, потому что я не видел сначала ваш, а затем понял, что вы можете быть заинтересованы. - person Glenn Slayden; 28.03.2019