Андрей Колесов

В обсуждениях разработки приложений в архитектуре 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).

Fig.1
Рис. 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 (управление командой меню).

Fig.2
Рис. 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).

Fig.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, который год назад имел кодовое название Everett, Microsoft тем самым выполнила первый пункт своей программы развития средств разработки (см. "Перспективы развития средств разработки для платформы .NET", "BYTE/Россия" No 11/2002). А спустя три месяца корпорация обнародовала уточненные планы модернизации инструментария до 2005 г., в соответствии с которыми на рынке должны появиться три ключевых продукта - инструментарий Visual Studio Tools для Microsoft Office System (2003 г.) и две версии пакета Visual Studio, которые сейчас называются соответственно Whidbey (2004 г.) и Orcas (2005 г.).

Выделение в отдельную позицию специальных инструментов для офисных разработчиков говорит о росте их актуальности. Такие средства существовали и ранее, но в предыдущих версиях Microsoft Office подобный набор включался в специальный выпуск Developer. Теперь же инструмент будет продаваться отдельно (соответственно варианта Developer в Office 2003 не будет).

Как известно, механизм автоматизации и среда разработки самого пакета Office 2003 (официальное его объявление состоялось 21 октября) по-прежнему базируется на механизмах VBA и COM. Однако применение Visual Studio Tools позволит разработчикам создавать DLL-расширения для Word и Excel в среде .NET Framework на языках VB.NET и C#. Сам инструмент реализован в виде дополнительного модуля, подключаемого к VB.NET 2003, и не исключено, что он будет распространяться бесплатно. Кроме того, инструмент будет доступен в виде отдельного продукта, в который также войдут Microsoft Access 2003 Developer Extensions, Visual Basic .NET Standard Edition и SQL Server 2000 Developer Edition.

В будущей версии Whidbey особое внимание будет уделено расширению возможностей разработки приложений, ориентированных на СУБД. В частности, с помощью Whidbey можно будет писать хранимые процедуры на языках VB.NET и C#. Соответственно СУБД SQL Server Yukon будет включать среду исполнения CLR (Common Language Runtime) на уровне внутреннего механизма базы данных.

Модернизация .NET Framework затронет основные технологии разработки приложений - Windows Forms, ASP.NET, ADO.NET, Web Services, Mobile Devices. Развитие получат все четыре языка, входящие в состав VS.NET, - VB.NET, C#, C++ и J#. Особое внимание будет уделено повышению производительности труда программиста.

В частности, новый компилятор VB.NET позволит на уровне проверки синтаксиса обнаружить ошибки, выявляемые сегодня лишь во время исполнения кода. Visual C++ можно будет использовать для разработки приложений для мобильных устройств. В C# будут усилены средства применения повторно используемого кода. Для J# создается технология Browser Controls, упрощающая перенос кода существующих апплетов в среду .NET Framework.

В Whidbey будут расширены возможности специализированных инструментов для архитекторов и разработчиков приложения масштаба предприятия, что должно превратить этот инструмент в средство поддержки полного жизненного цикла приложений - от разработки технических требований к программам до их сопровождения и модернизации.

О следующей версии Visual Studio, Orcas, достоверно известно только то, что ее появление будет привязано к созданию очередной версии Windows с кодовым названием Longhorn.

Разработка Мастеров

Мастера - это общий класс инструментов 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 объявила о начале программы сотрудничества с разработчиками под названием Visual Studio Industry Partner (VSIP, http://msdn.microsoft.com/vstudio/partners). Эта инициатива фактически представляет собой модернизированный вариант объединения действовавших ранее программ Visual Studio .NET Integration Program (она предоставляла независимым разработчикам возможность создавать собственные продукты на базе пакета Visual Studio .NET или интегрированные с ним) и Microsoft .NET Component Builder Program (предназначалась для производителей компонентов и элементов управления для .NET Framework).

Основное новшество в данном случае - наличие трех уровней партнерства, что резко понижает планку требований к ее участникам. Кроме того, VSIP стала носить всемирный характер (ранее она была доступна только на территории Северной Америки). В рамках обновленной программы практически всем желающим открывается свободный доступ к комплекту разработчика VSIP Software Development Kit, расширяющему возможности пользователей Visual Studio .NET в части настройки и интеграции с другими приложениями. С его помощью разработчики могут не только автоматизировать собственную деятельность, но и создавать коммерческие продукты, повышающие производительность труда программистов.

Программа VSIP предлагает три уровня сотрудничества с Microsoft:

Affiliate ("Компаньон"). Бесплатный уровень, предназначенный для небольших компаний и учебных заведений, нуждающихся в доступе к комплекту VSIP SDK. Они получат также доступ к группам новостей Web-узла сообщества VSIP и смогут размещать информацию о своих продуктах в электронном каталоге.

Alliance ("Альянс"). Партнеры этого уровня получают все возможности, предусмотренные уровнем Affiliate, а также годичную подписку на MSDN Universal и ряд дополнительных преимуществ в продвижении своих продуктов.

Premier ("Премьер"). Помимо получения всех преимуществ варианта Alliance, участники этого уровня получают возможность распространять пакет Visual Studio .NET вместе со своими продуктами, а также лицензировать Visual Studio Premier Partner Edition - специальную версию интегрированной среды разработки (без компиляторов), на базе которой партнеры могут создавать собственные программные системы.