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.
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:
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ą natrue
. 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ącExtensionType="VSSDK+VisualStudio.Extensibility"
do taguInstallation
.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
Teraz możesz używać wszystkich możliwości rozszerzenia VisualStudio.Extensibility wraz z istniejącym rozszerzeniem VSSDK.