Введение в технологию расширения проектов

Обновлен: Ноябрь 2007

Модель объектов станет доступной, если добавить в проект ссылку на сборки VSLangProj: VSLangProj.dll, VSLangProj2.dll, VSLangProj80.dll и VSLangProj90.dll. Дополнительные сведения см. в разделе Практическое руководство. Добавление или удаление ссылок в Visual Studio (Visual Basic). Это означает, что модель объектов доступна для макросов, надстроек и любых типов проектов, которым необходимо расширение или автоматизация IDE. Написание макросов происходит в соответствующей интегрированной среде разработки с использованием Visual Basic. Примеры кода в этом разделе приводятся на Visual C# и Visual Basic. Дополнительные сведения о запуске этих примеров см. в разделе Практическое руководство. Компиляция и выполнение примеров кода модели объектов автоматизации. Надстройки могут быть на любых языках Visual Studio, например Visual Basic, Visual C#, Visual C++ и Visual J#. Разделы справки для членов VSLangProj, VSLangProj2, VSLangProj80 и VslangProj90 включают синтаксис для каждого из этих языков. Дополнительные сведения об автоматизации типов проектов и возможностях автоматизации см. в разделе Создание надстроек и мастеров.

Пространства имен VSLangProj, VSLangProj2, VSLangProj80 и VSLangProj90

Эти пространства имен содержат все классы, интерфейсы и перечисления для проектов Visual Basic, Visual C# и Visual J#. Полный список объектов пространства имен см. в разделе Объектная модель расширения среды Visual Basic и Visual C# для проектов.

Возможная ошибка при использовании сборок VSLangProj со сборкой EnvDTE

Если создать проект, ссылающийся на одну или несколько сборок VSLangProj и сборку EnvDTE, при запуске может возникнуть следующая ошибка:

"Unhandled Exception: System.IO.FileNotFoundException: Error while loading file 'EnvDTE, Version=7.0.3300.0"

Эта ошибка вызвана конфликтом разрешения типов. В Visual Studio 2005 включена сборка EnvDTE версии 8.0.xx, однако ссылка в конфигурации проекта пытается найти более раннюю версию этой сборки, версию 7.0.xx. Для устранения проблемы следует добавить перенаправление на новую версию EnvDTE в файл конфигурации проекта (с расширением CONFIG). При этом в Visual Studio будет загружена новая версия EnvDTE и ошибка не возникнет.

Для этого добавьте в проект файл конфигурации приложения и замените его содержимое следующим кодом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-
        com:asm.v1" appliesTo="v2.0.50318">
            <dependentAssembly>
                <assemblyIdentity name="EnvDTE" publicKeyToken=
                "b03f5f7f11d50a3a"/>
                <bindingRedirect oldVersion="7.0.3300.0" 
                newVersion="8.0.0.0"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>

Объект VSProject2

Данный объект предоставляет доступ к другим объектам в модели расширяемости. Объект DTE является объектом верхнего уровня в модели автоматизации Visual Studio. В общей модели расширения проектам соответствует универсальный объект Project. Объект Project имеет свойство Object. Тип данного свойства определяется языком проекта во время выполнения. В проекте Visual Basic, Visual C# или Visual J# свойство Object возвращает объект типа VSProject2. Поскольку свойство Object имеет тип Object, необходимо привести ссылку к типу VSProject2. Если первый проект написан на языке Visual Basic, то в макросе это будет выглядеть следующим образом:

Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj
Imports VSLangProj2
Imports VSLangProj80
Imports VSLangProj90
Dim proj As EnvDTE.Project
Dim vsproject As VSLangProj80.VSProject2
proj = DTE.Solution.Projects.Item(1)
vsproject = CType(proj.Object, VSLangProj80.VSProject2)
using EnvDTE;
using EnvDTE80;
using EnvDTE90;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
EnvDTE.Project proj;
VSLangProj80.VSproject2 vsproject;
proj = DTE2.Solution.Projects.Item(1);
vsproject = (VSLangProj80.VSProject2)proj;

После добавления ссылки на элемент VSProject2 можно управлять свойствами проекта, конфигурациями, файлами, папками, операторами imports и ссылками.

Дополнительные сведения см. в разделе Знакомство с объектом VSProject2.

Ссылки и объекты Reference

Свойство References, содержащееся в объекте VSProject2, содержит набор объектов Reference3. Объект Reference3 предоставляет ссылку на проект и является доступным только для чтения объектом, поддерживающим метод Remove. Объект References поддерживает добавление ссылок (COM, сборки .NET, ActiveX, другие проекты) и выдачу событий (добавление, удаление и изменение ссылок).

Объект References не содержит веб-ссылок проекта. Веб-ссылки проекта могут быть извлечены путем доступа к свойству ProjectItems свойства WebReferencesFolder.

Для получения дополнительных сведений и примеров кода см. объекты Reference и Reference3, коллекцию References, свойства References и WebReferencesFolder.

Объект Imports

Объект Imports, находящийся в объекте VSProject2, содержит коллекцию операторов Imports, которые используются для проекта Visual Basic. При добавлении к данной коллекции оператора imports необязательно добавлять соответствующую инструкцию Imports (например, Imports VSLangProj). Данный объект поддерживает добавление и удаление операторов imports и выдачу событий в ответ на эти действия. В проекте Visual C# эквивалент отсутствует и при использовании свойство VSProject2.Imports возвращает Nothing или null при применении к проекту Visual C#. Дополнительные сведения см. в разделе Imports.

Объекты VSProjectItem и BuildManager

Объект VSProjectItem является аналогом элемента проекта объекта VSProject2. В общей модели расширения проектам соответствует универсальный объект ProjectItem. Свойство Object имеет тип Object, в проекте Visual Basic или Visual C# это свойство имеет тип VSProjectItem. В макросе приведение объекта к типу VSProjectItem будет выглядеть следующим образом.

Imports EnvDTE
Imports EnvDTE80
Imports VSLangProj
Imports VSLangProj2
Imports VSLangProj80
Imports VSLangProj90
Dim pi As VSProjectItem
pi = CType(DTE2.Solution.Projects.Item(1).ProjectItems.Item(1)._
    Object, VSProjectItem)
using EnvDTE;
using EnvDTE80;
using VSLangProj;
using VSLangProj2;
using VSLangProj80;
using VSLangProj90;
EnvDTE.Project proj;
VSLangProj.VSProjectItem pi;
Pi = (VSProject2)DTE2.Solution.Projects.Item(1).ProjectItems.Item(1).
Object;

Объект VSProjectItem содержит свойства, связывающие его с элементом родительского проекта и проектом, и метод, вызывающий принудительное выполнение пользовательского инструмента для этого элемента. Объект BuildManager обрабатывает выходные данные пользовательского инструмента. Для получения дополнительных сведений см. метод RunCustomTool, объекты Знакомство с объектом BuildManager, VSProjectItem и BuildManager.

Свойство "Properties"

Модель общей расширяемости имеет свойство Properties в трех объектах:

  • Объект Project   Свойства этого объекта эквивалентны свойствам вкладки Обычные свойства диалогового окна проекта "Страницы свойств" в интегрированной среде разработки.

  • Объект Configuration.   Свойства этого объекта эквивалентны свойствам вкладки Свойства конфигурации диалогового окна проекта "Страницы свойств" в интегрированной среде разработки.

  • Объект ProjectItem.   Свойства данного объекта эквивалентны свойствам окна Свойства при выборе элемента проекта в обозревателе решений.

  • В каждом случае свойство Properties представляет собой коллекцию объектов типа "Property". Чтобы получить объект Property из коллекции, следует указать либо индекс свойства (отсчет ведется от 1), либо его имя. Содержимое коллекции зависит от языка. В случае с элементами проекта содержимое также зависит от того, является ли элемент файлом или папкой.

См. также

Основные понятия

Область автоматизации Visual Studio

Другие ресурсы

Создание надстроек и мастеров