Разработка подтипов проекта
Подтипы проекта позволяют VSPackage расширять проекты на основе ядра Microsoft Build (MSBuild). Использование агрегирования позволяет повторно использовать основную часть основной управляемой системы проектов, реализованной в Visual Studio, но по-прежнему настраивать поведение для определенного сценария.
В следующих разделах подробно описано базовое проектирование и реализация подтипов проекта:
Конструктор подтипа проекта.
Многоуровневая агрегирование.
Поддержка интерфейсов.
Конструктор подтипа проекта
Инициализация подтипа проекта достигается путем агрегирования основных IVsHierarchy и IVsProject объектов. Это агрегирование позволяет подтипу проекта переопределить или повысить большую часть возможностей базового проекта. Подтипы проекта получают первую возможность обрабатывать свойства с помощью IVsHierarchyкоманд и IOleCommandTarget IVsUIHierarchyуправления элементами проекта.IVsProject3 Подтипы проекта также могут расширяться:
Объекты конфигурации проекта.
Зависимые от конфигурации объекты.
Объекты обзора независимо от конфигурации.
Объекты автоматизации проектов.
Коллекции свойств автоматизации проекта.
Дополнительные сведения о расширяемости по подтипам проекта см. в разделе "Свойства и методы, расширенные по подтипам проекта".
Файлы политики
Среда Visual Studio предоставляет пример расширения базовой системы проектов с подтипом проекта в реализации файлов политики. Файл политики позволяет формировать среду Visual Studio, управляя функциями, включающими Обозреватель решений, диалоговое окно "Добавить проект", диалоговое окно "Добавить новый элемент" и диалоговое окно "Свойства". Подтип политики переопределяет и улучшает эти функции с помощью IVsFilterAddProjectItemDlgи IOleCommandTarget
IVsUIHierarchy реализации.
Механизм агрегирования
Механизм агрегирования подтипа проекта среды поддерживает несколько уровней агрегирования, что позволяет реализовать расширенный подтип путем дальнейшего вкусового проекта. Кроме того, вспомогательные объекты подтипа проекта, например IVsProjectFlavorCfg, предназначены для разрешения нескольких уровней слоев. В соответствии с ограничениями правил агрегирования COM и COM, подтипов проектов и базовых проектов необходимо запрограммировать совместно, чтобы обеспечить правильное участие во внутренних подтипах или базовом проекте для правильного участия в делегировании вызовов методов и управлении счетчиками ссылок. То есть проект должен быть запрограммирован для поддержки агрегирования.
На следующем рисунке показано схематическое представление агрегата подтипа проекта с несколькими уровнями.
Агрегат подтипа проекта с несколькими уровнями состоит из трех уровней, базового проекта, который агрегируется подтипом проекта, а затем дополнительно агрегируется расширенным подтипом проекта. На рисунке рассматриваются некоторые вспомогательные интерфейсы, предоставляемые в рамках архитектуры подтипа проекта Visual Studio.
Механизмы развертывания
Среди многих функций базовой системы проектов, расширенных подтипом проекта, являются механизмы развертывания. Подтип проекта влияет на механизмы развертывания путем реализации интерфейсов конфигурации (таких как IVsDeployableProjectCfg и IVsBuildableProjectCfg) полученных путем вызова QueryInterface IVsProjectCfgProvider. В сценарии, когда подтип проекта и расширенный подтип проекта добавляют различные реализации конфигурации, базовый проект вызывает QueryInterface
расширенный подтип IUnknown
проекта. Если внутренний подтип проекта содержит реализацию конфигурации, которую запрашивает базовый проект, расширенный подтип проекта делегирует реализацию, предоставляемую внутренним подтипом проекта. В качестве механизма сохранения состояния от одного уровня агрегата до другого, все уровни подтипов проекта реализуются IPersistXMLFragment для сохранения данных XML, связанных с сборкой, в файлы проекта. Дополнительные сведения см. в разделе "Сохранение данных" в файле проекта MSBuild. IInternalExtenderProvider реализуется в качестве механизма получения расширений автоматизации из подтипов проекта.
На следующем рисунке основное внимание уделяется реализации расширения автоматизации, объекту обзора конфигурации проекта, в частности, используемому подтипами проекта для расширения базовой системы проектов.
Подтипы проекта могут расширить базовую систему проектов, расширив объектную модель автоматизации. Они определяются как часть объекта автоматизации DTE и используются для расширения объекта Project, ProjectItem
объекта и Configuration
объекта. Дополнительные сведения см. в разделе "Расширение объектной модели базового проекта".
Агрегирование на нескольких уровнях
Реализация подтипа проекта, которая упаковывает подтип проекта нижнего уровня, необходимо запрограммировать совместно, чтобы внутренний подтип проекта функционировал должным образом. Список обязанностей по программированию включает в себя:
Реализация IPersistXMLFragment подтипа проекта, который упаковывает внутренний подтип, должен делегировать IPersistXMLFragment реализации подтипа внутреннего проекта для обоих Load Save методов.
Реализация IInternalExtenderProvider подтипа проекта-оболочки должна делегироваться его внутреннему подтипу проекта. В частности, реализация GetExtenderNames должна получить строку имен из подтипа внутреннего проекта, а затем объединить строки, которые он хочет добавить в качестве расширителей.
Реализация IVsProjectCfgProvider подтипа проекта-оболочки должна создать экземпляр IVsProjectFlavorCfg объекта своего внутреннего подтипа проекта и сохранить его в качестве частного делегата, так как только объект конфигурации проекта базового проекта напрямую знает, что объект конфигурации подтипа проекта оболочки существует. Внешний подтип проекта может изначально выбирать интерфейсы конфигурации, которые он хочет обрабатывать напрямую, а затем делегировать остальные в реализацию внутреннего подтипа get_CfgTypeпроекта.
Вспомогательные интерфейсы
Базовый проект делегирует вызовы вспомогательных интерфейсов, добавленных подтипом проекта, для расширения различных аспектов его реализации. Это включает расширение объектов конфигурации проекта и различных объектов браузера свойств. Эти интерфейсы извлекаются путем вызова QueryInterface
punkOuter
(указателя на IUnknown
) агрегатора подтипа внешнего проекта.
Интерфейс | Подтип проекта |
---|---|
IVsProjectFlavorCfg | Позволяет подтипу проекта: — предоставление реализации IVsDeployableProjectCfg. — Управляйте запуском отладчика, позволяя подтипу проекта предоставлять собственную реализацию IVsDebuggableProjectCfg. — Отключите оценку выражений во время разработки, соответствующим образом обрабатывая DBGLAUNCH_DesignTimeExprEval случай в его реализации QueryDebugLaunch. |
IInternalExtenderProvider | Позволяет подтипу проекта: — Расширение VSHPROPID_BrowseObject проекта для добавления или удаления независимых свойств конфигурации проекта. — Расширение объекта автоматизации проекта (VSHPROPID_ExtObject) проекта. Приведенные выше значения свойств взяты из __VSHPROPID2 перечисления. |
IVsCfgBrowseObject | Позволяет подтипу проекта сопоставить объект с IVsCfg данным объектом, заданным объектом обзора конфигурации проекта. |
IVsBrowseObject | Позволяет подтипу проекта сопоставляться с IVsHierarchy объектом или VSITEMID объектом, учитывая объект обзора конфигурации проекта. |
IPersistXMLFragment | Позволяет подтипу проекта сохранять произвольные структурированные XML-данные в файле проекта (Vbproj или CSPROJ). Эти данные не отображаются в MSBuild. |
IVsBuildPropertyStorage | Позволяет подтипу проекта: — добавьте новые свойства MSBuild для сохранения. — удалите ненужные свойства из MSBuild. — запрос текущего значения свойства MSBuild. — Измените текущее значение свойства MSBuild. |