Введение в объектную модель расширяемости
Она поставляется с собственным интерфейсом прикладного программирования (API), чтобы дать разработчикам возможность управлять многими элементами интегрированной среды.
Этот API называется объектной .моделью расширяемости Visual Studio, и понимание его возможностей является ключом к освоению программирования и управления интегрированной средой, для чего пишется код в виде макросов и надстроек (см. главы 12 и 13).
В данной главе мы обсуждаем компоновку и структуру объектной модели расширяемости. Мы установим соответствие между различными объектами объектной модели и элементами интегрированной среды, изучим различные способы взаимодействия с этими объектами (при помощи управляемого кода) и начнем понимать возможности доработки Visual Studio.
Для того чтобы собрать воедино концепции объектной…
Объектная модель расширяемости — это структурированная библиотека классов с корневым объектом верхнего уровня под названием DTE (или DTE2, об этом несколько позже), что означает Development Tools Environment (среда разработки инструментов). Сделав ссылку на сборку, которая реализует объект DTE/DTE2, вы можете получить экземпляр этого корневого объекта и использовать его члены и дочерние классы для доступа к компонентам интегрированной среды разработки.
Объектная модель расширяемости реализована в трех разных взаимодействующих сборках: EnvDTE, EnvDTE80 и EnvDTE90. EnvDTE — это исходная сборка расширяемости, поставлявшаяся вместе с Visual Studio .NET 2003. EnvDTE80 — это библиотека, которая поставлялась с Visual Studio 2005, a EnvDTE90 поставляется с Visual Studio 2008. Причина использования нескольких сборок проста: они помогают сбалансировать потребность в новых функциональных возможностях с необходимостью сохранения обратной совместимости. Например, в Visual Studio 2008 фирма Microsoft столкнулась с необходимостью принять обычное проектное решение: либо заменить (или обновить) предыдущую сборку, поставлявшуюся с Visual Studio 2005 (EnvDTE80) и получить возможную несовместимость с имеющимися макросами и надстройками — либо поставлять новую…
Поскольку всякая работа по расширяемости Visual Studio начинается с объектной модели, то вы должны сначала понять, как она соответствует конструкциям интегрированной среды, и определить предоставляемые ею возможности.
Вы можете считать, что классы объектной модели организованы в категории, которые непосредственно соответствуют следующим концепциям интегрированной среды:
□ решения и проекты;
□ окна и панели команд (панели инструментов и меню);
□ документы;
□ команды;
□ отладчик;
□ события.
Каждый объект имеет отношение к своему элементу интегрированной среды и доступ к каждому объекту обычно производится через корневой объект DTE2.
Объект DTE/DTE2 представляет собой верхушку дерева API. Вы можете считать его представлением самой интегрированной среды Visual Studio, причем находящиеся ниже него объекты соответствуют различным частям интегрированной среды.
Как уже упоминалось, самая новая версия — это DTE2, а версия DTE обеспечивает совместимость с предыдущими версиями. В данной главе (если не будет необходимости подчеркнуть различия между ними) мы будем называть объекты DTE и DTE2 — просто DTE.
Свойства DTE используются для получения ссылок на конкретный объект интегрированной среды (или коллекцию объектов). Методы объектов используются для выполнения команд в интегрированной среде, запуска мастеров или выхода из интегрированной среды.
В табл. 11.2 показаны основные…
Объект Solution представляет собой текущее загруженное решение. Отдельные проекты решения доступны через объекты Project, возвращаемые в коллекции Solution. Projects. Доступ к элементам проекта можно получить аналогичным образом через коллекцию Project. Projectltems.
Как видно из рис. 11.1, эта иерархия точно отражает иерархию решение/проект, которую мы уже обсуждали в главе 4.
Здесь есть некоторые несоответствия — например, каталоги решений трактуются как проекты — но по большей части дерево объектной модели достаточно точно соответствует дереву проектов решения (к которому вы привыкли).
Члены объектов Solution и Solution2 позволяют вам взаимодействовать с текущим решением для выполнения таких стандартных задач, как следующие:
□ определение количества проектов…
Объект Solution очень удобен для получения ссылок на различные проекты решения. Каждый объект Project имеет свой собственный набор полезных членов для взаимодействия с проектами и их элементами.
Используя эти члены, вы можете взаимодействовать с проектами различными способами, такими как: переименование проекта, удаление проекта и сохранение проекта.
В табл. 11.4 приведен обзор наиболее часто используемых членов Project.
Кроме основных атрибутов и элементов проекта через экземпляр Project можно получить доступ к реальному коду исходных файлов проекта.
При помощи свойства CodeModel вы можете получить доступ ко всей линейке прокси-объектов, представляющих собой конструкции кода внутри проекта. Например, интерфейс CodeClass позволяет вам изучить и отредактировать код для данного класса в данном проекте.
Примечание
Поддержка объектов модели CodeModel для разных языков отличается. В документации MSDN для каждого типа CodeModel четко указана имеющаяся языковая поддержка данного элемента.
После получения ссылки на CodeModel из экземпляра Project вы можете получить доступ к его коллекции CodeElements (которая (естественно) является коллекцией объектов CodeElement). CodeElement — это…
Та видимая часть Visual Studio, которая содержит контент, представлена объектами Window. Объекты Window— это экземпляры открытых окон интегрированной среды (такие как Solution Explorer, окно Task List, открытое окно редактора кода и т. д.) Даже сама интегрированная среда представлена объектом Window.
Любое окно является либо окном документа, либо окном инструмента. Окна документов содержат документы, редактируемые при помощи Text Editor. Окна инструментов содержат элементы управления, которые отображают информацию, соответствующую текущему контексту интегрированной среды; окна Solution Explorer и Task List являются примерами окон инструментов, а открытый в редакторе файл исходного кода на языке Visual Basic — это пример окна документа.
Если вам нужно отыскать конкретное окно, то у вас есть несколько вариантов (оптимальных для разных ситуаций).
Для новичков: главное окно интегрированной среды всегда доступно непосредственно из объекта dte:
Dim IDE As Window IDE = DTE.MainWindow
Очевидно, что если вам нужно выполнить определенное действие с окном интегрированной среды, то это самый быстрый вариант.
Свойство DTE.ActiveWindow также предоставляет прямой и быстрый доступ к объекту Window (в данном случае это текущее активное окно):
Dim CurrentWindow As Window CurrentWindow = DTE.ActiveWindow
Окна инструментов в интегрированной среде (окно команд, окно списка ошибок, окно вывода, окна Solution Explorer.и Task List и панель инструментов)— также имеют прямой…