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


Использование VisualStudio.Extensibility SDK и VSSDK вместе

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

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

В этом документе дан краткий обзор различных вариантов использования пакета VisualStudio.Extensibility SDK (in-proc).

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

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

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

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

Хотя модель VisualStudio.Extensibility была создана в основном для размещения расширений вне процесса devenv.exe, начиная с Visual Studio 2022 17.4 (предварительная версия 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 с шаблоном совместимости VSSDK для создания нового решения.

снимок экрана шаблона проекта непосредственного расширения VisualStudio.Extensibility.

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

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

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

    снимок экрана с примером команды расширения.

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

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

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

Классы 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

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

TargetFramework и VssdkCompatibleExtension

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

Проект расширения также должен содержать свойство VssdkCompatibleExtension, заданное для true.

<PropertyGroup>
  <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>

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

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

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

    ...

Манифест пакета

Проект расширения должен включать манифест пакета с именем source.extension.vsixmanifest. Тег Installation должен иметь значение ExtensionType, установленное в VSSDK+VisualStudio.Extensibility.

<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
    <Metadata>
        <Identity Id="MyExtensionId.f14b8c45-154f-4584-abd7-9ec22af003e2" Version="1.0" Language="en-US" Publisher="Microsoft" />
        <DisplayName>My extension</DisplayName>
        <Description xml:space="preserve">My extension's description.</Description>
    </Metadata>
    <Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
        <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
            <ProductArchitecture>amd64</ProductArchitecture>
        </InstallationTarget>
      <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
        <ProductArchitecture>arm64</ProductArchitecture>
      </InstallationTarget>
    </Installation>
    <Prerequisites>
        <Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
    </Prerequisites>
    <Assets>
        <Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
    </Assets>
</PackageManifest>

Использование 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.2092" />
  </ItemGroup>
  • Теперь в вашем пакете или других компонентах вы можете запросить экземпляр VisualStudioExtensibility с помощью метода GetServiceAsync.
...
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

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

  • Вам нужен стиль пакета SDK .csproj для использования пакетов SDK VisualStudio.Extensibility. Для существующих проектов вам может понадобиться обновить .csproj в стиль SDK.

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

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" PrivateAssets="all" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" PrivateAssets="all" />
  • Добавьте свойство VssdkCompatibleExtension в файл проекта, присвойте ему значение true. Это свойство включает некоторые функции VSSDK для обеспечения совместимости.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • Создайте новый класс расширения, наследующий от базового класса Extension и задайте свойство RequiresInProcessHosting, как показано ранее.
  • Измените файл source.extension.vsixmanifest, добавив ExtensionType="VSSDK+VisualStudio.Extensibility" в тег Installation.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

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