Udostępnij za pośrednictwem


Używanie zestawu VisualStudio.Extensibility SDK i zestawu VSSDK razem

Chociaż model VisualStudio.Extensibility został utworzony głównie w celu hostowania rozszerzeń poza procesem devenv.exe, można użyć interfejsów API zestawu VisualStudio.Extensibility SDK w rozszerzeniu uruchamianym w procesie programu Visual Studio oraz wykorzystującym tradycyjne interfejsy API rozszerzalności udostępniane przez pakiety Microsoft.VisualStudio.Sdk.

Obsługa użycia w procesie jest przeznaczona dla wczesnych użytkowników nowych interfejsów API VisualStudio.Extensibility, którzy polegają na Microsoft.VisualStudio.Sdk, aby wypełnić wszelkie luki w funkcjonalności.

Ten dokument jest szybkim przewodnikiem po różnych opcjach korzystania z zestawu VisualStudio.Extensibility SDK in-proc.

  • Jeśli tworzysz nowe rozszerzenie, zalecaną metodą jest utworzenie rozszerzenia VisualStudio.Extension hostowanego w procesie po tym samouczku. Ta metoda pozwala korzystać z pełnych możliwości zestawu SDK VisualStudio.Extensibility oraz na wstrzykiwanie usług VSSDK i MEF.

  • Jeśli masz istniejące rozszerzenie VSSDK, możesz skorzystać z tych wskazówek, aby użyć nowego wystąpienia VisualStudioExtensibility rozszerzenia.

  • Jeśli chcesz dodać polecenia, wizualizatory debugowania, okna narzędzi do istniejącego rozszerzenia VSSDK przy użyciu zestawu VISUALStudio.Extensibility SDK, możesz zapoznać się z te porady hostować zarówno rozszerzenie VSSDK, jak i rozszerzenie VisualStudio.Extensibility w tym samym projekcie rozszerzenia programu VS.

Tworzenie pierwszego rozszerzenia VisualStudio.Extensibility zgodnego z zestawem VSSDK

Chociaż model rozszerzenia VisualStudio.Extensibility został utworzony głównie w celu hostowania rozszerzeń poza procesem devenv.exe, począwszy od programu Visual Studio 2022 2022 17.4 (wersja zapoznawcza 1), można utworzyć rozszerzenie VisualStudio.Extensibility hostowane w ramach devenv.exe i może używać tradycyjnych interfejsów API rozszerzalności udostępnianych przez pakiety Microsoft.VisualStudio.Sdk.

Warunki wstępne

  • Program Visual Studio 2022 w wersji 17.9 (wersja zapoznawcza 1 lub nowsza) z obciążeniem Visual Studio extension development.
  • Jeśli aktualizujesz z wcześniejszych kompilacji, pamiętaj, aby odinstalować program VisualStudio.Extensibility Project System, aby uniknąć potencjalnych konfliktów.

Tworzenie projektu rozszerzenia

  • Użyj szablonu VisualStudio.Extensibility Extension z kompatybilnością z VSSDK, aby utworzyć nowe rozwiązanie.

Zrzut ekranu przedstawiający szablon projektu rozszerzenia w procesie dla VisualStudio.Extensibility.

Debugowanie rozszerzenia

  • Naciśnij F5, aby rozpocząć debugowanie. Spowoduje to skompilowanie rozszerzenia i wdrożenie go w eksperymentalnym wystąpieniu używanej wersji programu Visual Studio. Debuger powinien zostać dołączony po załadowaniu rozszerzenia.

  • Polecenie można znaleźć w menu Extensions, jak pokazano na poniższej ilustracji:

    Zrzut ekranu przedstawiający przykładowe polecenie rozszerzenia.

Korzystanie z usług zestawu Visual Studio SDK z rozszerzenia VisualStudio.Extensibility

Projekt rozszerzenia zgodny z zestawem VS SDK odwołuje się do pakietu Microsoft.VisualStudio.Sdk, który umożliwia dostęp do wszystkich usług zestawu Visual Studio SDK.

Tradycyjnie takie usługi są konsumowane za pośrednictwem MEF lub AsyncServiceProvider. Rozszerzenie VisualStudio.Extensibility jest zachęcane do iniekcji zależności platformy .NET.

Klasy MefInjection<TService> i AsyncServiceProviderInjection<TService, TInterface> (zarówno z przestrzeni nazw Microsoft.VisualStudio.Extensibility.VSSdkCompatibility) umożliwiają korzystanie z usług z zestawu SDK programu Visual Studio przez dodanie ich do konstruktora klasy, która jest tworzona przez iniekcję zależności (np. polecenie, okno narzędzia lub część rozszerzenia).

W poniższym przykładzie pokazano, jak można dodać usługi DTE2 i IBufferTagAggregatorFactoryService do polecenia.

    [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),
        };

Anatomia rozszerzenia VisualStudio.Extensibility, które jest zgodne z VSSDK

Podczas korzystania z rozszerzenia VisualStudio.Extensibility z zgodnością z VSSDK, szablon automatycznie konfiguruje cały projekt, ale dobrze jest wiedzieć, jakie są podstawowe składniki rozszerzenia zgodnego z VS-SDK w ramach VisualStudio.Extensibility oraz jakie są różnice w porównaniu do wspólnego wariantu opisanego w przewodniku "tworzenie pierwszego rozszerzenia" .

TargetFramework i VssdkCompatibleExtension

Projekt rozszerzenia musi być przeznaczony dla wersji platformy .NET używanej przez docelową wersję programu Visual Studio. W przypadku programu Visual Studio 2022 muszą one być przeznaczone dla programu .NET Framework 4.7.2.

Projekt rozszerzenia musi również zawierać właściwość VssdkCompatibleExtension ustawioną na true.

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

Właściwość RequiresInProcessHosting

Klasa Extension musi być skonfigurowana z właściwością RequiresInProcessHosting = true, która identyfikuje rozszerzenie jako w procesie.

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

    ...

Manifest pakietu

Projekt rozszerzenia musi zawierać manifest pakietu o nazwie source.extension.vsixmanifest. Tag Installation musi mieć ExtensionType ustawiony na wartość 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>

Korzystanie z VisualStudio.Extensibility w istniejących rozszerzeniach VSSDK

W przypadku istniejących rozszerzeń VSSDK kolejną opcją jest wykonywanie zapytań o wystąpienie VisualStudioExtensibility za pośrednictwem dostawcy usług i korzystanie z jego metod. Ta metoda umożliwia korzystanie z nowej powierzchni API VisualStudio.Extensibility SDK w istniejących składnikach. Ta opcja może być przydatna w sytuacjach, w których chcesz użyć nowego interfejsu API do wykonywania zapytań dotyczących informacji o projekcie, zarządzania dokumentami bez tworzenia nowego rozszerzenia opartego na rozszerzeniu VisualStudio.Extensibility.

Oto przykładowy fragment kodu pokazujący, jak można wykorzystać VisualStudioExtensibility w pakiecie VSSDK:

  • W pliku .csproj dołącz referencję pakietu do API VisualStudio.Extensibility.
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
  </ItemGroup>
  • Teraz możesz wykonywać zapytania dotyczące wystąpienia VisualStudioExtensibility za pomocą metody GetServiceAsync w pakiecie lub innych składnikach:
...
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);
        ...
    }
}

Dodawanie rozszerzenia VisualStudio.Extensibility do istniejącego projektu rozszerzenia VSSDK

Jeśli chcesz również dodawać składniki, takie jak okna narzędzi i odbiorniki edytora, używając VisualStudio.Extensibility SDK w istniejącym rozszerzeniu VSSDK, będziesz musiał wykonać dodatkowe kroki, aby utworzyć wystąpienie VisualStudio.Extensibility Extension w projekcie.

  • Aby korzystać z pakietów VisualStudio.Extensibility SDK, potrzebujesz stylu .csproj zestawu SDK. W przypadku istniejących projektów musisz zaktualizować .csproj do stylu SDK.

  • Usuń odwołanie do pakietu dla Microsoft.VSSDK.BuildTools, a zamiast tego dodaj odwołania do pakietu dla rozszerzenia VisualStudio.Extensibility.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
  • Dodaj właściwość VssdkCompatibleExtension do pliku projektu, ustawiając ją na true. Ta właściwość umożliwi zapewnienie zgodności niektórych funkcji zestawu VSSDK.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • Utwórz nową klasę rozszerzenia dziedziczącą z klasy bazowej Extension i ustaw właściwość RequiresInProcessHosting, jak pokazano wcześniej.
  • Zmodyfikuj plik source.extension.vsixmanifest dodając ExtensionType="VSSDK+VisualStudio.Extensibility" do tagu Installation.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

Teraz możesz używać wszystkich możliwości rozszerzenia VisualStudio.Extensibility wraz z istniejącym rozszerzeniem VSSDK.