Поделиться через


Часто задаваемые вопросы. Преобразование надстроек в расширения VSPackage

Надстройки устарели. Теперь для создания нового расширения Visual Studio требуется создать VSPackage. Если у вас уже есть надстройка, она может еще работать, но для распространения ее необходимо конвертировать в VSPackage. Ниже вы найдете ответы на часто задаваемые вопросы о конвертировании надстройки Visual Studio в расширение VSPackage.

Важно!

Во многих случаях можно просто передать код надстройки в проект VSPackage.Чтобы получить объект автоматизации DTE, следует вызвать GetService в методе Initialize.

DTE2 dte = (DTE2)GetService(typeof(DTE));

Дополнительные сведения см. в разделе Как запустить код надстройки в VSPackage? ниже.

Какое программное обеспечение требуется для разработки расширений VSPackage?

В дополнение к Visual Studio 2013 версии Professional, Premium или Ultimate необходимо установить Visual Studio 2013 SDK. SDK можно загрузить на странице Visual Studio 2013 SDK на сайте Центра загрузок Microsoft. Рекомендуем установить SDK перед установкой Visual Studio 2013 с обновлением 2.

Где находится документация по VSPackage?

Начните с раздела интеграция SDK Visual Studio. Из него можно открыть все остальные разделы о разработке VSPackage.

Можно ли конвертировать проект надстройки в проект VSPackage?

Проект надстройки нельзя конвертировать в проект VSPackage, так как в проектах VSPackage используются не такие механизмы, как в проектах надстроек. Шаблон проекта VSPackage содержит много кода, что позволяет относительно легко создавать и запускать расширения VSPackage.

С чего начать разработку расширений VSPackage?

Все необходимые элементы расширения VSPackage находятся в шаблоне проекта. Вот как создать VSPackage с командой меню.

Создание VSPackage с командой меню

  1. Создайте проект пакета Visual Studio с именем TestVSPackage. ((Файл, Создать, Проект или введите имя проекта в окне Быстрый запуск.) В диалоговом окне Новый проект разверните узел Другие типы проектов, Расширяемость и выберите Пакет Visual Studio. Назовите проект TestVSPackage и укажите его расположение.

  2. Откроется Мастер пакетов Visual Studio. На странице Выбрать язык программирования выберите язык C#. Оставьте выбранным параметр Сгенерировать новый ключ. На странице Параметры VSPackage выберите пункт Команда меню. Нажмите кнопку Готово.

  3. Нажмите клавишу F5, чтобы построить проект и запустить его в режиме отладки.

    Откроется второй экземпляр Visual Studio. Он называется экспериментальным экземпляром и может содержать не такие настройки, как экземпляр Visual Studio, используемый для написания кода. При первом запуске экспериментального экземпляра будет выдано предложение зайти в VS Online и определить тему и профиль.

    В меню Сервис (экспериментального экземпляра) есть кнопка Мое имя команды. При нажатии этой кнопки появляется сообщение: В TestVSPackagePackage.MenuItemCallback().

Как запустить код надстройки в VSPackage?

Код надстройки можно запустить одним из двух способов.

  • Путем запуска команды меню (код находится в методе IDTCommandTarget.Exec).

  • Автоматически при запуске (код находится в обработчике событий OnConnection).

То же самое можно сделать в VSPackage. Вот как добавить код надстройки в метод обратного вызова.

Внедрение команды меню в VSPackage

  1. Создайте VSPackage с командой меню. (См. раздел С чего начать разработку расширений VSPackage?.)

  2. Откройте файл, содержащий определение VSPackage. (В проекте C# это <имя проекта>Package.cs.)

  3. Добавьте в файл следующие операторы using:

    using EnvDTE;
    using EnvDTE80;
    
  4. Найдите метод MenuItemCallback. Добавьте вызов GetService, чтобы получить объект DTE2:

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. Добавьте код из метода надстройки IDTCommandTarget.Exec. Предположим, что у вас есть код, который добавляет новую область в окно Вывод и печатает в этой области "Какой-то текст".

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE));
        OutputWindow outputWindow = dte.ToolWindows.OutputWindow;
    
        OutputWindowPane outputWindowPane = outputWindow.OutputWindowPanes.Add("A New Pane");
        outputWindowPane.OutputString("Some Text");
    }
    
  6. Постройте и запустите этот проект. Нажмите клавишу F5 или выберите команду Запуск на панели инструментов Отладка. В экспериментальном экземпляре Visual Studio в меню Сервис должна появиться кнопка Мое имя команды. При нажатии этой кнопки в области окна Вывод должен появляться Какой-то текст. (Откройте окно Вывод.)

Можно также настроить запуск кода при загрузке. Обычно для расширений VSPackage эту возможность не используют. Если при запуске Visual Studio попытаются загрузиться слишком много расширений, время запуска может заметно увеличиться. Лучше настроить автоматическую загрузку расширения VSPackage при выполнении определенных условий (например, при открытии решения).

В следующей процедуре показано, как запустить в расширении VSPackage код надстройки, загружающий ее автоматически при открытии решения.

Настройка автоматической загрузки VSPackage

  1. Создайте проект пакета Visual Studio. (Необходимые для этого действия см. в разделе С чего начать разработку расширений VSPackage?. Назовите проект TestAutoload и укажите его расположение.

  2. Откроется Мастер пакетов Visual Studio. На странице Выбрать язык программирования выберите язык C# и оставьте выбранным параметр Сгенерировать новый ключ. Нажмите кнопку Готово.

  3. Откройте TestAutoloadPackage.cs. Найдите строку, где объявляется класс пакета:

    public sealed class <name of your package>Package : Package
    
  4. Над этой строкой есть набор атрибутов. Добавьте следующий атрибут:

    [ProvideAutoLoad(UIContextGuids80.SolutionExists)]
    
  5. Установите точку останова в методе Initialize() и запустите отладку (F5).

  6. Откройте проект в экспериментальном экземпляре. После этого должен загрузиться проект VSPackage и сработать точка останова.

Можно определить другие контексты загрузки VSPackage, используя для этого поля UIContextGuids80. Для получения дополнительной информации см. Практическое руководство. Autoload VSPackage.

Как получить объект DTE?

Если надстройка, например, не отображает пользовательский интерфейс, команды меню, кнопки панели инструментов или инструменты Windows, можно использовать код как есть, пока не будет получен объект DTE автоматизации из VSPackage. Это делается так.

Получение объекта DTE из VSPackage

  1. В решении VSPackage найдите файл <имя проекта>Package.cs. Это класс, который извлекается из Package и может помочь при взаимодействии с Visual Studio. В данном случае используйте GetService, чтобы получить объект DTE2.

  2. Добавьте следующие операторы using:

    using EnvDTE;
    using EnvDTE80;
    
  3. Найдите метод Initialize. Данный метод обрабатывает команду, указанную в Мастере пакетов. Добавьте вызов GetService, чтобы получить объект DTE:

    DTE dte = (DTE)GetService(typeof(DTE));
    

После получения объекта автоматизации DTE можно добавить в проект остальную часть кода надстройки. Если вам нужен объект DTE2, проделайте то же самое.

Как применить стиль VSPackage к командам меню и кнопкам панели инструментов в надстройке?

Расширения VSPackage используют для создания большинства команд меню, панелей инструментов, кнопок панели инструментов и других элементов пользовательского интерфейса файл .VSCT. Шаблон проекта VSPackage позволяет создать команду в меню Инструменты. Для получения дополнительной информации см. Пошаговое руководство: Создание команды меню ресурсов с помощью шаблона пакета Visual Studio.

Дополнительные сведения о файлах .VSCT см. в разделе Как VSPackages добавления элементов пользовательского интерфейса в IDE. Инструкции по использованию файла VSCT для добавления элементов меню, панелей инструментов и кнопок панелей инструментов см. в разделе Пошаговые руководства, для команд меню, панелей инструментов.

Как добавить пользовательские окна инструментов с помощью VSPackage?

Шаблон проекта VSPackage позволяет создать окно инструментов. Дополнительную информацию см. в разделе окна инструментов и указанных в нем статьях, в особенности Практическое руководство. Создание окна инструментов.

Как управлять окнами Visual Studio с помощью VSPackage?

Если надстройка управляет окнами Visual Studio, то код надстройки также должен работать в VSPackage. Например, в следующей процедуре показано, как добавить код, управляющий Списком задач в методе VSPackage MenuItemCallback.

Вставка кода управления окнами из надстройки в VSPackage

  1. Создайте VSPackage с командой меню, как описано в разделе С чего начать разработку расширений VSPackage?.

  2. Откройте файл, содержащий определение VSPackage. (В проекте C# это <имя проекта>Package.cs.)

  3. Добавьте следующие операторы using:

    using EnvDTE;
    using EnvDTE80;
    
  4. Найдите метод MenuItemCallback. Добавьте вызов GetService, чтобы получить объект DTE2:

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. Добавьте код из надстройки. Для примера возьмем код, который добавляет новые задачи в Список задач, перечисляет количество задач и удаляет одну задачу.

    private void MenuItemCallback(object sender, EventArgs e) 
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE)); 
    
        TaskList tl = (TaskList)dte.ToolWindows.TaskList; 
        askItem tlItem; 
    
        // Add a couple of tasks to the Task List. 
        tlItem = tl.TaskItems.Add(" ", " ", "Test task 1.",  
            vsTaskPriority.vsTaskPriorityHigh, vsTaskIcon.vsTaskIconUser, 
            true, "", 10, true, true);
        tlItem = tl.TaskItems.Add(" ", " ", "Test task 2.", 
            vsTaskPriority.vsTaskPriorityLow, vsTaskIcon.vsTaskIconComment, true, "", 20, true,true);
    
        // List the total number of task list items after adding the new task items.
        System.Windows.Forms.MessageBox.Show("Task Item 1 description: "+tl.TaskItems.Item(2).Description);
        System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); 
    
        // Remove the second task item. The items list in reverse numeric order. 
        System.Windows.Forms.MessageBox.Show("Deleting the second task item");
        tl.TaskItems.Item(2).Delete();
        System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); 
    }
    

Как управлять проектами и решениями в VSPackage?

Если надстройка управляет проектами и решениями, то код надстройки также должен работать в VSPackage. Например, в следующей процедуре показано, как добавить код для получения запускаемого проекта.

  1. Создайте VSPackage с командой меню, как описано в разделе С чего начать разработку расширений VSPackage?.

  2. Откройте файл, содержащий определение VSPackage. (В проекте C# это <имя проекта>Package.cs.)

  3. Добавьте следующие операторы using:

    using EnvDTE;
    using EnvDTE80;
    
  4. Найдите метод MenuItemCallback. Добавьте вызов GetService, чтобы получить объект DTE2:

    DTE2 dte = (DTE2)GetService(typeof(DTE));
    
  5. Добавьте код из надстройки. Например, следующий код позволяет получить имя запускаемого проекта в решении. (При запуске этого пакета должно быть открыто многопроектное решение.)

    private void MenuItemCallback(object sender, EventArgs e)
    {
        DTE2 dte = (DTE2) GetService(typeof(DTE)); 
    
        SolutionBuild2 sb = (SolutionBuild2)dte.Solution.SolutionBuild; 
        Project startupProj; 
        string msg = "";
    
        foreach (String item in (Array)sb.StartupProjects) 
        {
            msg += item; 
        }
        System.Windows.Forms.MessageBox.Show("Solution startup Project: "+msg); 
        startupProj = dte.Solution.Item(msg); 
        System.Windows.Forms.MessageBox.Show("Full name of solution's startup project: "+"/n"+startupProj.FullName); 
    }
    

Как настроить сочетания клавиш в VSPackage?

Используйте элемент <KeyBindings> файла .VSCT. В следующем примере для команды idCommand1 задается сочетание клавиш Alt + A, а для команды idCommand2 — Alt + Ctrl + A. Обратите внимание на синтаксис ключевых имен.

<KeyBindings>
    <KeyBinding guid="MyProjectCmdSet" id="idCommand1" editor="guidVSStd97" key1="A" mod1="ALT" />
    <KeyBinding guid="MyProjectCmdSet" id="idCommand2" editor="guidVSStd97" key1="A" mod1="CONTROL" mod2="ALT" />
</KeyBindings>

Как обрабатывать события автоматизации в VSPackage?

События обрабатываются в VSPackage точно так же, как и в надстройке. В следующем примере кода демонстрируется обработка события OnItemRenamed. (В данном примере предполагается, что у вас уже есть объект DTE.)

Events2 dteEvents = (Events2)dte.Events;
dteEvents.ProjectItemsEvents.ItemRenamed += listener1.OnItemRenamed; 
. . .
public void OnItemRenamed(EnvDTE.ProjectItem projItem, string oldName) 
{
    string s = "[Event] Renamed " + oldName + " to " + Path.GetFileName(projItem.get_FileNames(1) + " in project " + projItem.ContainingProject.Name; 
}