Freigeben über


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.

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

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:

    Screenshot showing sample extension command.

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:

  1. 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,
  2. 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>
...
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 auf true. Diese Eigenschaft aktiviert einige VSSDK-Features zur Kompatibilität.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    

Sie können jetzt alle Funktionen von VisualStudio.Extensibility zusammen mit Ihrer vorhandenen VSSDK-Erweiterung verwenden.