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.
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:
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:
- biblioteka klas, która odwołuje się do pakietów VisualStudio.Extensibility i Visual Studio SDK oraz zawiera cały kod rozszerzenia,
- 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>
- Teraz możesz wykonywać zapytania dotyczące wystąpienia visualStudioExtensibility za pomocą
GetServiceAsync
metody 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ż 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ą 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
Extension
klasy bazowej i ustaw właściwość RequiresInProcessHosting , jak pokazano wcześniej.
Teraz możesz używać wszystkich możliwości rozszerzenia VisualStudio.Extensibility wraz z istniejącym rozszerzeniem VSSDK.