Verwenden von VisualStudio.Extensibility SDK und VSSDK zusammen
Während das VisualStudio.Extensibility-Modell in erster Linie zum Hosten von Erweiterungen außerhalb des devenv.exe-Prozesses erstellt wurde, ist es möglich, VisualStudio.Extensibility SDK-APIs in einer Erweiterung zu verwenden, die im Visual Studio-Prozess ausgeführt wird und herkömmliche Erweiterbarkeits-APIs verwendet, die von den Microsoft.VisualStudio.Sdk-Paketen bereitgestellt werden.
Die Unterstützung der In-Proc-Verwendung soll Early Adoptern die neuen VisualStudio.Extensibility-APIs ermöglichen, während sie sich auf Microsoft.VisualStudio.Sdk verlassen, um alle Featurelücken abzudecken.
Dieses Dokument ist eine schnelle exemplarische Vorgehensweise für verschiedene Optionen zur Verwendung des VisualStudio.Extensibility SDK in proc.
Wenn Sie eine neue Erweiterung entwickeln, empfiehlt es sich, eine VisualStudio.Extension zu erstellen, die in diesem Lernprogramm gehostet wird. Mit dieser Methode können Sie zusätzlich zu VSSDK- und MEF-Diensten vollständige Funktionen des VisualStudio.Extensibility SDK verwenden.
Wenn Sie über eine vorhandene VSSDK-Erweiterung verfügen, können Sie diese Tipps befolgen, um die neue VisualStudioExtensibility-Instanz in Ihrer Erweiterung zu verwenden.
Wenn Sie Befehle, Debugschnellansichten, Toolfenster zu Ihrer vorhandenen VSSDK-Erweiterung mithilfe des VisualStudio.Extensibility SDK hinzufügen möchten, können Sie auf diese Tipps verweisen, um sowohl eine VSSDK-Erweiterung als auch eine VisualStudio.Extensibility-Erweiterung im selben VS-Erweiterungsprojekt zu hosten.
Erstellen Ihrer ersten VS SDK-kompatiblen VisualStudio.Extensibility-Erweiterung
Während das VisualStudio.Extensibility-Modell hauptsächlich zum Hosten von Erweiterungen außerhalb des devenv.exe-Prozesses erstellt wurde, ist es ab Visual Studio 2022 17.4 Preview 1 möglich, eine VisualStudio.Extensibility-Erweiterung zu erstellen, die in devenv.exe gehostet wird und herkömmliche Erweiterbarkeits-APIs verwenden kann, die von den Microsoft.VisualStudio.Sdk-Paketen bereitgestellt werden.
Voraussetzungen
- Visual Studio 2022, Version 17.9 Preview 1 oder höher, mit der
Visual Studio extension development
Workload. - Wenn Sie von früheren Builds aktualisieren, müssen Sie VisualStudio.Extensibility Project System deinstallieren, um potenzielle Konflikte zu vermeiden.
Erstellen des Erweiterungsprojekts
- Verwenden Sie die VisualStudio.Extensibility Extension with VS SDK Compatibility template, um eine neue Lösung zu erstellen.
Debuggen der Erweiterung
Legen Sie das Containerprojekt als Startprojekt fest, und drücken
F5
Sie, um das Debuggen zu starten.Durch Drücken
F5
der Builds Der Erweiterung wird die Erweiterung in der experimentellen Instanz der verwendeten Visual Studio-Version bereitgestellt. Der Debugger sollte nach dem Laden der Erweiterung angefügt werden.Sie finden den Befehl im
Extensions
Menü wie in der folgenden Abbildung dargestellt:
Verwenden von Visual Studio SDK-Diensten aus einer VisualStudio.Extensibility-Erweiterung
Ein VS-SDK-kompatibles Erweiterungsprojekt verweist auf das Microsoft.VisualStudio.Sdk-Paket , das den Zugriff auf alle Dienste des Visual Studio SDK ermöglicht.
Traditionell werden solche Dienste entweder über MEF oder den AsyncServiceProvider genutzt. Stattdessen wird ein VisualStudio.Extensibility Extender zur .NET-Abhängigkeitsinjektion empfohlen.
Mit MefInjection<TService>
den Klassen (beide aus dem Microsoft.VisualStudio.Extensibility.VSSdkCompatibility
Namespace) können Sie die Dienste des Visual Studio SDK nutzen, indem Sie sie dem Konstruktor einer Klasse hinzufügen, die durch Abhängigkeitsinjektion instanziiert wird (z. B. ein Befehls-, Toolfenster- oder ErweiterungsteilAsyncServiceProviderInjection<TService, TInterface>
).
Das folgende Beispiel zeigt, wie die DTE2
Dienste einem IBufferTagAggregatorFactoryService
Befehl hinzugefügt werden können.
[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),
};
Anatomie einer VSSDK-kompatiblen VisualStudio.Extensibility-Erweiterung
Die Verwendung der VisualStudio.Extensibility Extension with VS SDK Compatibility Template übernimmt die Einrichtung der gesamten Lösung, es ist hilfreich zu wissen, was die grundlegenden Komponenten einer VS-SDK-kompatiblen VisualStudio.Extensibility-Erweiterung sind und wie sie sich von der gängigen Variante unterscheidet, die im Handbuch "Erstellen Ihrer ersten Erweiterung" beschrieben wird.
Containerprojekt
Eine VS-SDK-kompatible VisualStudio.Extensibility-Lösung besteht aus zwei Projekten:
- eine Klassenbibliothek, die sowohl auf die VisualStudio.Extensibility- als auch auf die Visual Studio SDK-Pakete verweist und den gesamten Code der Erweiterung enthält,
- ein VSIX-Containerprojekt, das Sie zum Bereitstellen und Debuggen der Erweiterung verwenden.
Diese Trennung ist eine temporäre Lösung, während sich die VisualStudio.Extensibility in der Vorschau befindet und das endgültige Paket- und Bereitstellungsdesign abgeschlossen wird.
Der Extender sollte dem Containerprojekt keinen Code, keine Inhalte oder Ressourcen hinzufügen. Das einzige Ziel des Containerprojekts besteht darin, die vom anderen Projekt bereitgestellten Ressourcen einzuschließen.
TargetFramework
Sowohl das Erweiterungsprojekt als auch das Containerprojekt müssen auf die .NET-Version abzielen, die von der Visual Studio-Zielversion verwendet wird. Für Visual Studio 2022 müssen sie .NET Framework 4.7.2 als Ziel verwenden.
RequiresInProcessHosting-Eigenschaft
Die Extension
Klasse muss mit der RequiresInProcessHosting = true
Eigenschaft konfiguriert werden, die die Erweiterung als in-process identifiziert.
[VisualStudioContribution]
internal class MyExtension : Extension
{
public override ExtensionConfiguration? ExtensionConfiguration => new()
{
RequiresInProcessHosting = true,
};
...
Verwenden von VisualStudio.Extensibility aus vorhandenen VSSDK-Erweiterungen
Bei vorhandenen VSSDK-Erweiterungen besteht eine weitere Option darin, die VisualStudioExtensibility-Instanz über den Dienstanbieter abzufragen und seine Methoden zu verwenden. Mit dieser Methode können Sie den API-Oberflächenbereich von VisualStudio.Extensibility SDK in Ihren vorhandenen Komponenten verwenden. Diese Option kann in Situationen hilfreich sein, in denen Sie die neue API verwenden möchten, um Projektinformationen abzufragen, dokumentverwaltung, ohne eine neue visualStudio.Extensibility-basierte Erweiterung zu erstellen.
Hier ist ein Beispielcodeausschnitt, der zeigt, wie ein Codeausschnitt in einem VSSDK-Paket verwendet VisualStudioExtensibility
werden kann:
- Fügen Sie in Der
.csproj
Datei einen Paketverweis auf VisualStudio.Extensibility-APIs hinzu:
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
</ItemGroup>
- Sie können jetzt eine Abfrage für die VisualStudioExtensibility-Instanz über
GetServiceAsync
die Methode in Ihrem Paket oder anderen Komponenten durchführen:
...
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);
...
}
}
Hinzufügen einer VisualStudio.Extensibility-Erweiterung zu einem vorhandenen VSSDK-Erweiterungsprojekt
Wenn Sie auch Komponenten wie Toolfenster, Editorlistener mit dem VisualStudio.Extensibility SDK in Ihrer vorhandenen VSSDK-Erweiterung beitragen möchten, müssen Sie zusätzliche Schritte ausführen, um eine VisualStudio.Extensibility Extension-Instanz in Ihrem Projekt zu erstellen.
Sie benötigen einen SDK-Stil
.csproj
, um VisualStudio.Extensibility SDK-Pakete zu verwenden. Bei vorhandenen Projekten müssen Sie Möglicherweise Ihr.csproj
Update auf eine SDK-Formatvorlage 1 ausführen.Entfernen Sie den Paketverweis für
Microsoft.VSSDK.BuildTools
VisualStudio.Extensibility, und fügen Sie stattdessen Paketverweise hinzu.
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.23-preview-1" />
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
- Fügen Sie der Projektdatei Eigenschaft hinzu, und legen Sie
VssdkCompatibleExtension
sie auftrue
. Diese Eigenschaft aktiviert einige VSSDK-Features zur Kompatibilität.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- Erstellen Sie eine neue Erweiterungsklasse, die von
Extension
der Basisklasse erbt, und legen Sie die RequiresInProcessHosting-Eigenschaft fest, wie zuvor gezeigt.
Sie können jetzt alle Funktionen von VisualStudio.Extensibility zusammen mit Ihrer vorhandenen VSSDK-Erweiterung verwenden.