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


Совместное использование пакета SDK для VisualStudio.Extensibility и VSSDK

Хотя модель VisualStudio.Extensibility была создана в основном для размещения расширений за пределами процесса devenv.exe, можно использовать API пакета SDK VisualStudio.Extensibility в расширении, работающем в процессе Visual Studio, и использовать традиционные API расширяемости, предоставляемые пакетами Microsoft.VisualStudio.Sdk .

Поддержка использования в proc предназначена для раннего внедрения новых API-интерфейсов VisualStudio.Extensibility при использовании Microsoft.VisualStudio.Sdk для покрытия любого разрыва функций.

В этом документе описано краткое пошаговое руководство по различным вариантам использования пакета SDK для Расширения VisualStudio.Extensibility in-proc.

  • Если вы разрабатываете новое расширение, рекомендуется создать расширение VisualStudio.Extension, размещенное в процессе после этого руководства. Этот метод позволяет использовать полные возможности пакета SDK для VisualStudio.Extensibility, а также возможность внедрения служб VSSDK и MEF.

  • Если у вас есть расширение VSSDK, вы можете следовать этим советам , чтобы использовать новый экземпляр VisualStudioExtensibility в расширении.

  • Если вы хотите добавить команды, отладить визуализаторы, окна инструментов в существующее расширение VSSDK с помощью пакета SDK для Расширения VisualStudio.Extensibility, можно ознакомиться с этими советами , чтобы разместить расширение VSSDK и расширение Расширения VisualStudio.Extensibility в одном проекте расширения VS.

Создание первого расширения VisualStudio.Extensibility, совместимого с VSSDK

Хотя модель VisualStudio.Extensibility была создана в основном для расширений размещения за пределами процесса devenv.exe, начиная с Visual Studio 2022 17.4 Preview 1, можно создать расширение VisualStudio.Extensibility, размещенное в devenv.exe, и использовать традиционные API расширяемости, предоставляемые пакетами Microsoft.VisualStudio.Sdk .

Необходимые компоненты

  • Visual Studio 2022 версии 17.9( предварительная версия 1 или более поздняя версия) с рабочей нагрузкой Visual Studio extension development .
  • Если вы обновляете из предыдущих сборок, удалите VisualStudio.Extensibility Project System, чтобы избежать потенциальных конфликтов.

Создание проекта расширения

  • Используйте расширение VisualStudio.Extensibility с шаблоном совместимости пакета SDK VS для создания нового решения.

Screenshot of the VisualStudio.Extensibility in-process extension project template.

Отладка расширения

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

  • Нажатие клавиши F5 создает расширение и развертывает его в экспериментальном экземпляре используемой версии Visual Studio. Отладчик должен присоединиться после загрузки расширения.

  • Команду можно найти в меню, как показано на Extensions следующем рисунке:

    Screenshot showing sample extension command.

Использование служб ПАКЕТА SDK Visual Studio из расширения VisualStudio.Extensibility

Проект расширения, совместимый с VS-SDK, ссылается на пакет Microsoft.VisualStudio.Sdk, который позволяет получить доступ ко всем службам пакета SDK Visual Studio.

Традиционно такие службы используются через MEF или AsyncServiceProvider. Вместо этого рекомендуется использовать расширение расширений зависимостей VisualStudio.Extensibility.

Классы MefInjection<TService>AsyncServiceProviderInjection<TService, TInterface> (оба из Microsoft.VisualStudio.Extensibility.VSSdkCompatibility пространства имен) позволяют использовать службы пакета SDK Visual Studio, добавляя их в конструктор класса, экземпляр которого создается путем внедрения зависимостей (например, команды, окна инструментов или части расширения).

В следующем примере показано, как DTE2 можно добавить службы в IBufferTagAggregatorFactoryService команду.

    [VisualStudioContribution]
    public class Command1 : Command
    {
        private TraceSource traceSource;
        private AsyncServiceProviderInjection<DTE, DTE2> dte;
        private MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService;

        public Command1(
            VisualStudioExtensibility extensibility,
            TraceSource traceSource,
            AsyncServiceProviderInjection<DTE, DTE2> dte,
            MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService)
            : base(extensibility)
        {
            this.dte = dte;
            this.bufferTagAggregatorFactoryService = bufferTagAggregatorFactoryService;
        }
    
        public override CommandConfiguration CommandConfiguration => new("Sample Remote Command")
        {
            Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
            Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        };

Анатомия расширения VisualStudio.Extensibility, совместимого с VSSDK

Несмотря на то, что при использовании расширения расширяемости VisualStudio.Extensibility с шаблоном совместимости пакета SDK VS необходимо настроить все решение, полезно знать, какие основные компоненты расширения VisualStudio.Extensibility отличаются от общего варианта, описанного в руководстве по созданию первого расширения.

Проект контейнера

Решение VisualStudio.Extensibility, совместимое с VS-SDK, состоит из двух проектов:

  1. библиотека классов, которая ссылается на пакеты пакета SDK VisualStudio.Extensibility и Visual Studio и содержит весь код расширения.
  2. проект VSIX контейнера, используемый для развертывания и отладки расширения.

Это временное решение, в то время как VisualStudio.Extensibility находится в предварительной версии, а окончательная упаковка и разработка развертывания завершены.

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

TargetFramework

Проект расширения и проект контейнера должны быть нацелены на версию .NET, используемую целевой версией Visual Studio. Для Visual Studio 2022 они должны быть нацелены на платформа .NET Framework 4.7.2.

Требуется свойствоInProcessHosting

Класс Extension должен быть настроен с RequiresInProcessHosting = true помощью свойства, определяющего расширение как внутрипроцессное.

[VisualStudioContribution]
internal class MyExtension : Extension
{
    public override ExtensionConfiguration? ExtensionConfiguration => new()
    {
        RequiresInProcessHosting = true,
    };

    ...

Использование VisualStudio.Extensibility из существующих расширений VSSDK

Для существующих расширений VSSDK можно запросить экземпляр VisualStudioExtensibility через поставщика услуг и использовать его методы. Этот метод позволяет использовать новую область поверхности API visualStudio.Extensibility SDK в существующих компонентах. Этот параметр может быть полезен в ситуациях, когда вы хотите использовать новый API для запроса сведений о проекте, управления документами без создания нового расширения на основе VisualStudio.Extensibility.

Ниже приведен пример фрагмента кода, который показывает, как можно использовать VisualStudioExtensibility в пакете VSSDK:

  • .csproj В файле добавьте ссылку на пакет API VisualStudio.Extensibility:
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
  </ItemGroup>
...
using Microsoft.VisualStudio.Extensibility;
...

public class VSSDKPackage : AsyncPackage
{
    protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
    {
        VisualStudioExtensibility extensibility = await this.GetServiceAsync<VisualStudioExtensibility, VisualStudioExtensibility>();
        await extensibility.Shell().ShowPromptAsync("Hello from in-proc", PromptOptions.OK, cancellationToken);
        ...
    }
}

Добавление расширения VisualStudio.Extensibility в существующий проект расширения VSSDK

Если вы также хотите внести свой вклад в такие компоненты, как окна инструментов, прослушиватели редакторов с помощью пакета SDK visualStudio.Extensibility в существующем расширении VSSDK, вам потребуется выполнить дополнительные действия, чтобы создать экземпляр расширения Расширения VisualStudio.Extensibility в проекте.

  • Для использования пакетов SDK VisualStudio.Extensibility ТРЕБУЕТся стиль .csproj ПАКЕТА SDK. Для существующих проектов может потребоваться обновить стиль .csproj пакета SDK.

  • Удалите ссылку на пакет и Microsoft.VSSDK.BuildTools вместо этого добавьте ссылки на пакеты для VisualStudio.Extensibility.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.23-preview-1" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
  • Добавьте VssdkCompatibleExtension свойство в файл проекта, присвойте ему значение true. Это свойство включает некоторые функции VSSDK для обеспечения совместимости.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    

Теперь вы можете использовать все возможности VisualStudio.Extensibility вместе с существующим расширением VSSDK.