Создание настроек и Мастеров для Visual Studio .NET
Андрей Колесов
В обсуждениях разработки приложений в архитектуре Microsoft .NET речь чаще всего идет об использовании возможностей среды .NET Framework и соответствующих языков программирования (в первую очередь Visual Basic .NET и C#). При этом гораздо меньше внимания уделяется второму ключевому компоненту разработки — самому инструменту Visual Studio .NET, его интегрированной среде разработки (IDE).
Но, начав работать с VS.NET, многие разработчики быстро осознают, что производительность их труда очень сильно зависит от умения эффективно применять этот мощный, многофункциональный, но в то же время непростой инструмент. Далеко не все его возможности лежат на поверхности, до многих из них приходится добираться методом проб и ошибок — от разработчика требуется систематическое изучение возможностей продукта.
Возросшие сложность и универсальность VS.NET заставляют обратить особое внимание и на задачу адаптации инструмента к специфике создания определенных категорий приложений и к работе конкретного программиста, т. е. на настройку среды и автоматизацию процесса разработки. Средства для этого были и в более ранних версиях инструментария Microsoft, однако пакет VS.NET предоставляет здесь гораздо более широкие возможности. Свидетельством востребованности этого функционала служит хотя бы то, что с появлением VS.NET резко возросло число коммерческих продуктов — дополнительных средств, предназначенных именно для повышения производительности труда его пользователей.
В этой связи следует отметить, что возможности расширения VS.NET представлены на двух уровнях. Первый, реализованный в виде объектной модели Development Tools Extensibility (DTE), открыт и доступен всем пользователям продукта. Второй закрыт для всеобщего применения, работать с ним могут только участники программы Visual Studio Industry Partner уровня Premier (см. врезку "Партнерская программа Microsoft для разработчиков"). Тем не менее почти двухлетний опыт присутствия VS.NET на рынке показывает, что даже возможности первого уровня позволяют программисту не только повысить эффективность работы с помощью собственноручно созданных средств, но и производить специализированный инструментарий для коммерческого распространения.
Иерархическая модель автоматизации DTE включает около 200 объектов, с помощью которых можно получить доступ практически ко всем компонентам и функциям VS.NET IDE. Реализовать расширения можно в виде макросов, надстроек (Add-ins) и Мастеров (Wizards).
Макросы — самое простое, но при этом весьма эффективное средство автоматизации работы в среде VS.NET. Механизм их поддержки включает возможность записи макросов, а также собственную IDE, которую, в свою очередь, можно расширять с помощью модели DTE. Подробнее о применении макросов говорится в статье "Расширение возможностей среды разработки Visual Studio .NET" ("BYTE/Россия" Nо 12/2002).
Надстройки, оформляемые в виде двоичных DLL-модулей с использованием интерфейса IDTExtensibility2, в принципе реализуют ту же функциональность, что и макросы, но обладают более высоким быстродействием. К тому же надстройки можно писать не только на VB.NET, но и на любых языках, поддерживающих создание COM-объектов, в том числе и на .NET-языках. Использование надстроек выглядит для пользователя так же, как применение встроенных компонентов IDE. Этот вариант расширений гораздо больше подходит для регулярного применения тех или иных функций, тем более — для их коммерческого распространения.
С технологической точки зрения Мастера очень похожи на надстройки, но для их реализации используется интерфейс ITDWizard, и ориентированы они на пошаговое выполнение той или иной задачи. Простейший пример — Мастера, создающие проект специального типа.
Мастер надстроек
Надстройки можно писать "с нуля вручную" — в виде проекта типа Class Library, но гораздо удобнее воспользоваться специальным мастером Add-in Wizard, запуск которого выполняется в окне New Project через меню Other Projects|Extensibility Projects (рис. 1). Предусмотрено два варианта использования данного Мастера — VS.NET Add-in и Shared Add-in. Первый позволяет создавать надстройки только для среды VS.NET и Macros IDE, второй — еще и для офисных приложений, имеющих интерфейс IDTExtensibility2 (Word, Visio, Project, Excel, PowerPoint, Outlook, ProntPage, Access).
Рис. 1. Запуск Мастера надстроек.
|
После запуска Add-in Wizard Мастер проходит через последовательность диалоговых окон, в которых задаются требования к основным параметрам надстройки.
Язык программирования. В надстройках, создаваемых этим Мастером, можно
применять языки C#, VB.NET и VC++/ATL. При написании надстройки вручную можно
использовать любой язык, поддерживающий создание COM-объектов.
Хост-приложение. Как уже говорилось, в данном случае можно делать расширения
для VS.NET IDE, Macros IDE или для обеих этих сред.
Имя и описание. Здесь вводятся сведения о проекте, которые сохраняются
в Реестре.
Опции Add-in. Здесь определяется новый элемент меню, через который надстройка
будет загружаться и запускаться на выполнение. Можно также включать поддержку
компоновки в командной строке (без применения элементов диалогового пользовательского
интерфейса), задавать режимы загрузки при запуске приложения, а также привилегии
доступа пользователей.
Окно с информацией о программе. Вводятся сведения, отображаемые в диалоговом
окне About.
По завершении работы (рис. 2) Add-Ins Wizard создает проект самой надстройки (DLL) и проект установки (файл Windows Installer, используемый для распространения надстройки). Сама надстройка представляет собой библиотеку DLL, обязательно включающую класс Connect. Именно он реализует интерфейс IDTExtensibility2 с пятью обязательными методами — OnConnect (вызывается при загрузке надстройки), OnStartupComplete (при завершении загрузки VS.NET), OnAddInsUpdate (при загрузке и выгрузке надстройки в VS.NET), OnBeginShutDown (при закрытии VS.NET) и OnDisconnection (при выгрузке надстройки). Если в начальном определении параметров надстройки было задано применение команд меню IDE, то в Connect формируется также интерфейс IDTCommandTarget, включающий методы Exec (вызов команды) и QueryStatus (управление командой меню).
Рис. 2. Результат работы Мастера надстроек.
|
Программный код, сформированный Мастером, по объему невелик (заполняются только методы OnConnection, Exec и QueryStatus), но все же он представляет собой вполне работоспособную настройку (см. листинг). Остается только написать код, выполняющий необходимые операции.
Фрагмент кода файла Connect, созданного Мастером надстроек
Imports Microsoft.Office.Core imports Extensibility imports System.Runtime.InteropServices Imports EnvDTE <GuidAttribute("40D6099B-9BB6-4E70-BA21-8F8EABF9B2FE"), >br> ProgIdAttribute("MyAddin2.Connect")> _ Public Class Connect Implements Extensibility.IDTExtensibility2 Implements IDTCommandTarget Dim applicationObject As EnvDTE.DTE Dim addInInstance as EnvDTE.AddIn Public Sub OnConnection _ (ByVal application As Object, _ ByVal connectMode As _ Extensibility.ext_ConnectMode, _ ByVal addInInst As Object, _ ByRef custom As System.Array) _ Implements Extensibility.IDTExtensibility2.OnConnection applicationObject = CType(application, EnvDTE.DTE) addInInstance = CType(addInInst, EnvDTE.AddIn) If connectMode = _ Extensibility.ext_ConnectMode. _ ext_cm_UISetup Then Dim objAddIn As AddIn = CType(addInInst, AddIn) Dim CommandObj As Command Try CommandObj = applicationObject. _ Commands.AddNamedCommand(_ objAddIn, "MyAddin2", "MyAddin2", _ "Executes the command for MyAddin2", _ True, 59, Nothing, 1 + 2) CommandObj.AddControl _ (applicationObject.CommandBars.Item("Tools")) Catch e as System.Exception End Try End If End Sub Public Sub Exec _ (ByVal cmdName As String, _ ByVal executeOption As vsCommandExecOption, _ ByRef varIn As Object, _ ByRef varOut As Object, _ ByRef handled As Boolean) _ Implements IDTCommandTarget.Exec handled = False If (executeOption = _ vsCommandExecOption. _ vsCommandExecOptionDoDefault) Then If cmdName = _ "MyAddin2.Connect.MyAddin2" Then handled = True Exit Sub End If End If End Sub End Class |
Модель автоматизации среды разработки
Как уже говорилось, для автоматизации среды разработки предусмотрена иерархическая объектная модель, на вершине которой размещается корневой объект DTE, находящийся в пространстве имен EnvDTE библиотек классов .NET. С помощью почти двухсот объектов этой модели программист получает доступ практически ко всем компонентам и функциям IDE VS.NET и Macros IDE (рис. 3).
Рис. 3. Верхняя часть иерархии объектов среды разработки.
|
Приведем краткий перечень некоторых основных групп объектов:
- Solutions, Project, ProjectItem — управление всеми компонентами проектов;
- Document, TextDocument — работа с документами;
- TextEdit, TextPoint — редактирование текстов (код, документы);
- FileCodeModel, CodeModel — манипулирование конструкциями кода;
- Window, CommandWindows, ToolBox и т. д. — управление отдельными окнами и панелями инструментов в среде разработки;
- Command — доступ к командам IDE;
- Debugger — доступ к объектам, управляющим отладчиком VS.NET.
У каждого объекта есть свой набор свойств и методов. Многие компоненты имеют перекрестные ссылки, поэтому доступ к тому или иному объекту можно получить различными способами.
Вторая важная составляющая модели автоматизации — набор событий, которые позволяют автоматически реагировать на выполнение в среде VS.NET тех или иных действий. Самый простой пример возможного применения данного механизма — автоматическое протоколирование ключевых моментов при работе в VS.NET.
Не останавливаясь на подробностях применения событий автоматизации, отметим
только, что все события объединены в группы, называемые интерфейсами событий.
Эти интерфейсы (BuildEvents, CommandEnvents, WindowsEvents и т. п.) доступны
разработчику через набор свойств интерфейса EndDTE.Events. Обработка события
выполняется путем подписки на него и написания функции, реализующей выполнение
необходимых действий.
Что ожидает пользователей средств разработки MicrosoftВыпустив в мае этого года обновленный пакет Visual Studio .NET 2003, Выделение в отдельную позицию специальных инструментов для офисных разработчиков Как известно, механизм автоматизации и среда разработки самого пакета В будущей версии Whidbey особое внимание будет уделено расширению возможностей Модернизация .NET Framework затронет основные технологии разработки приложений В частности, новый компилятор VB.NET позволит на уровне проверки синтаксиса В Whidbey будут расширены возможности специализированных инструментов О следующей версии Visual Studio, Orcas, достоверно известно только то, |
Разработка Мастеров
Мастера — это общий класс инструментов Windows, упрощающих выполнение часто повторяющихся задач, в том числе в пошаговом режиме взаимодействия с пользователем. В VS.NET Мастера используются для автоматической генерации кода. В составе пакета есть большой набор готовых Мастеров (с одним из них, Мастером надстроек, мы уже познакомились), но разработчик может создавать и свои собственные.
В VS.NET предусмотрены три типа Мастеров:
Мастер нового проекта (New Project wizard), генерирующий исходный код
при создании проекта. Доступ к таким инструментам можно получить, выбрав соответствующие
элементы на правой панели диалогового окна New Project.
Мастер добавления нового элемента (Add New Item wizard). С их помощью
к проекту добавляются новые программные файлы. Для доступа к ним используется
диалоговое окно Add New Item (оно появляется, если щелкнуть правой кнопкой на
проекте в окне Solution Explorer и выбрать команду Add|Add New Item).
Пользовательский Мастер (Custom wizard). Он может выполнять различные
задачи, но запускает только макросы, надстройки или другие Мастера.
Любой Мастер — это COM-объект, использующий программный интерфейс EnvDTE.IDTWizard. Разработка Мастеров идет по следующей схеме: написание COM-объекта, формирование VSZ-файла и создание шаблонов с исходным кодом.
Вызов Мастера выполняется с помощью метода Execute, обращение к которому происходит при загрузке Мастера. При этом в процедуру передаются следующие параметры:
- Application — DTE-объект текущего экземпляра VS.NET;
- BwndOwner — описатель окна, которое можно использовать в качестве родительского для размещения в нем элементов пользовательского интерфейса;
- ContextParams — массив элементов, описывающий текущее состояние VS.NET;
- CustomParams — массив, содержащий данные, определенные разработчиком или пользователем Мастера.
Если подключение надстроек выполняется с помощью их регистрации в системном Реестре, то Мастера становятся доступны для работы через VSZ-файлы, имеющие простой текстовый формат. Описание каждого Мастера включает идентификатор программы ProgID или класса ClassID, а также произвольный набор параметров, который передается в программу виде массива CustomParams.
Чтобы значки Мастеров появились в соответствующих окнах VS.NET, нужно поместить VSZ-файлы в определенные каталоги. Их имена можно легко задать с помощью такого кода:
' для окна New Project: NewProjectPathName = _ DTE.Solution.TemplatePath( _ VSLangProj.PrjKind.prjKindVBProject) ' для окна Add New Item: AddNewItemPathName = _ DTE.Solution.ProjectItemTemplatePath( _ VSLangProj.PrjKind.prjKindVBProject) |
Этот код получает нужные имена каталогов для VB-проектов. Для проектов C# нужно последний параметр заменить на prjKindCSharpProject. Чтобы каждому Мастеру в диалоговом окне соответствовал свой оригинальный значок, вместе с VSZ-описателем нужно поместить файл значка с таким же именем, но с расширением ICO.
В принципе Мастер может формировать весь код программным образом, строка за строкой. Однако гораздо удобнее использовать заготовки, реализованные в виде шаблонов, редактируя их в соответствии с указанием пользователя. Добавление шаблонов проектов к решению выполняется двумя методами объекта Solution — AddFromFile и AddFromTemplate. Первый подключает к проекту сам файл, а второй — специально сделанную для данного проекта копию файла. Для подключения шаблонов к существующему проекту используются аналогичные методы объекта ProjectItems.
***
В этой статье мы хотели показать только принципиальные подходы к расширению
возможностей Visual Studio .NET. Разработка надстроек и Мастеров потребует более
глубокого изучения модели автоматизации IDE VS.NET и Macros IDE. Однако затраченные
на это усилия наверняка быстро окупятся за счет повышения эффективности работы
программиста.
Партнерская программа Microsoft для разработчиковВ конце нынешнего лета Microsoft объявила о начале программы сотрудничества Основное новшество в данном случае — наличие трех уровней партнерства, Программа VSIP предлагает три уровня сотрудничества с Microsoft: Affiliate ("Компаньон"). Бесплатный уровень, предназначенный для Alliance ("Альянс"). Партнеры этого уровня получают все возможности, Premier ("Премьер"). Помимо получения всех преимуществ варианта |