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

Chociaż model rozszerzenia VisualStudio.Extensibility został utworzony głównie w celu hostowania rozszerzeń poza procesem devenv.exe, można użyć interfejsów API zestawu SDK VisualStudio.Extensibility w rozszerzeniu uruchomionym w procesie programu Visual Studio i wykorzystaniu tradycyjnych interfejsów API rozszerzalności udostępnianych przez pakiety Microsoft.VisualStudio.Sdk .

Obsługa użycia in-proc ma na celu umożliwienie wczesnych użytkowników nowych interfejsów API VisualStudio.Extensibility przy jednoczesnym wykorzystaniu zestawu Microsoft.VisualStudio.Sdk w celu pokrycia wszelkich luk w funkcjach.

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 wykonaniu tego samouczka. Ta metoda umożliwia korzystanie z pełnych możliwości zestawu VisualStudio.Extensibility SDK oprócz możliwości wstrzykiwania zestawów VSSDK i MEF.

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

  • Jeśli chcesz dodać polecenia, debugowanie wizualizatorów, okien narzędzi do istniejącego rozszerzenia VSSDK przy użyciu zestawu VISUALStudio.Extensibility SDK, możesz zapoznać się z tymi wskazówkami , aby 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 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 .

Wymagania 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 rozszerzenia VisualStudio.Extensibility z szablonem zgodności zestawu VS SDK, aby utworzyć nowe rozwiązanie.

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

Debugowanie rozszerzenia

  • Ustaw projekt kontenera jako Projekt startowy, naciśnij klawisz F5 , aby rozpocząć debugowanie.

  • Naciśnięcie klawisza F5 kompiluje rozszerzenie i wdraża je w eksperymentalnym wystąpieniu używanej wersji programu Visual Studio. Debuger powinien zostać dołączony po załadowaniu rozszerzenia.

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

    Screenshot showing sample extension command.

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ą używane za pośrednictwem mef lub AsyncServiceProvider. Rozszerzenie VisualStudio.Extensibility jest zamiast tego zachęcane do wstrzykiwania zależności platformy .NET.

Klasy MefInjection<TService> i AsyncServiceProviderInjection<TService, TInterface> (zarówno z Microsoft.VisualStudio.Extensibility.VSSdkCompatibility przestrzeni nazw) umożliwiają korzystanie z usług zestawu SDK programu Visual Studio przez dodanie ich do konstruktora klasy utworzonej za pomocą wstrzykiwania zależności (na przykład polecenia, okna narzędzi lub części rozszerzenia).

W poniższym przykładzie pokazano, jak DTE2 można dodać usługi 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 zgodnego z zestawem VSSDK

Podczas korzystania z rozszerzenia VisualStudio.Extensibility z szablonem zgodności zestawu VS SDK zajmuje się konfigurowaniem całego rozwiązania, warto wiedzieć, jakie są podstawowe składniki rozszerzenia zgodnego z zestawem VS SDK VisualStudio.Extensibility i jak różni się on od wspólnego wariantu opisanego w przewodniku "tworzenie pierwszego rozszerzenia".

Projekt kontenera

Rozwiązanie VisualStudio.Extensibility zgodne z zestawem VS SDK składa się z dwóch projektów:

  1. biblioteka klas, która odwołuje się do pakietów VisualStudio.Extensibility i Visual Studio SDK oraz zawiera cały kod rozszerzenia,
  2. projekt VSIX kontenera używany do wdrażania i debugowania rozszerzenia.

Ta separacja jest tymczasowym rozwiązaniem, gdy rozszerzenie VisualStudio.Extensibility jest w wersji zapoznawczej, a ostateczny projekt pakowania i wdrażania jest finalizowany.

Rozszerzenie nie powinno dodawać kodu, zawartości ani zasobów do projektu kontenera. Jedynym celem projektu kontenera jest uwzględnienie zasobów udostępnianych przez inny projekt.

TargetFramework

Zarówno projekt rozszerzenia, jak i projekt kontenera muszą być przeznaczone 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.

Wymaga Właściwości WymagaInProcessHosting

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

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

    ...

Używanie rozszerzenia VisualStudio.Extensibility z istniejących rozszerzeń 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 nowego obszaru powierzchni interfejsu API zestawu 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, który pokazuje, jak można go wykorzystać VisualStudioExtensibility w pakiecie VSSDK:

  • W pliku .csproj dołącz odwołanie do pakietu do interfejsów 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);
        ...
    }
}

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

Jeśli chcesz również współtworzyć składniki, takie jak okna narzędzi, odbiorniki edytora przy użyciu zestawu VISUALStudio.Extensibility SDK w istniejącym rozszerzeniu VSSDK, należy wykonać dodatkowe kroki, aby utworzyć wystąpienie rozszerzenia VisualStudio.Extensibility w projekcie.

  • Aby korzystać z pakietów VisualStudio.Extensibility SDK, potrzebny jest styl .csproj zestawu SDK zestawu SDK. W przypadku istniejących projektów może być konieczne zaktualizowanie .csproj elementu do stylu zestawu SDK.

  • Usuń odwołanie do pakietu dla Microsoft.VSSDK.BuildTools elementu i zamiast tego dodaj odwołania do pakietu dla programu 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" />
  • Dodaj VssdkCompatibleExtension właściwość 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>    

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