Freigeben über


Verwenden von VisualStudio.Extensibility SDK und VSSDK zusammen

Während das VisualStudio.Extensibility-Modell hauptsächlich 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-Process-Nutzung dient dazu, Early Adopters Zugriff auf die neuen VisualStudio.Extensibility-APIs zu ermöglichen, während Microsoft.VisualStudio.Sdk zum Schließen von Featurelücken verwendet wird.

Dieses Dokument ist eine schnelle Einführung in verschiedene Optionen zur Nutzung des VisualStudio.Extensibility SDK in-proc.

  • Wenn Sie eine neue Erweiterung entwickeln, empfiehlt es sich, eine VisualStudio.Extension-Erweiterung zu erstellen, die im Anschluss an dieses Tutorial als In-Process-Erweiterung gehostet wird. Mit dieser Methode können Sie die vollen Funktionalitäten des Visual Studio Extensibility SDK nutzen und zusätzlich VSSDK- und MEF-Dienste einbinden.

  • Wenn Sie über eine vorhandene VSSDK-Erweiterung verfügen, können Sie diesen Tipps folgen, um die neue VisualStudioExtensibility Instanz in Ihrer Erweiterung zu verwenden.

  • Wenn Sie Mithilfe des VisualStudio.Extensibility SDK Befehle, Debugschnellansichten, Toolfenster zu Ihrer vorhandenen VSSDK-Erweiterung hinzufügen möchten, können Sie sich auf diese Tipps beziehen, um sowohl eine VSSDK-Erweiterung als auch eine VisualStudio.Extensibility-Erweiterung im selben VS-Erweiterungsprojekt zu hosten.

Erstellen Ihrer ersten VSSDK-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 Workload Visual Studio extension development
  • 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 Vorlage Erweiterung für „VisualStudio.Extensibility“ mit VSSDK-Kompatibilität, um eine neue Lösung zu erstellen.

Screenshot: Projektvorlage „VisualStudio.Extensibility-In-Process-Erweiterung“

Debuggen der Erweiterung

  • Drücken Sie F5, um mit dem Debuggen zu beginnen. Dadurch wird Die Erweiterung erstellt und in der experimentellen Instanz der verwendeten Visual Studio-Version bereitgestellt. Der Debugger sollte angehängt werden, sobald Ihre Erweiterung geladen ist.

  • Sie finden den Befehl im menü Extensions wie in der folgenden Abbildung dargestellt:

    Screenshot mit Beispielerweiterungsbefehl.

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 AsyncServiceProvidergenutzt. Ein VisualStudio.Extensibility-Extender wird stattdessen für die .NET-Dependency-Injection empfohlen.

Mit den klassen MefInjection<TService> und AsyncServiceProviderInjection<TService, TInterface> (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 Erweiterungsteil).

Das folgende Beispiel zeigt, wie die dienste DTE2 und IBufferTagAggregatorFactoryService einem 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 von VSSDK-kompatiblen VisualStudio.Extensibility-Erweiterungen

Bei der Verwendung der VisualStudio.Extensibility Extension mit der VSSDK Compatibility Vorlage wird das gesamte Projekt eingerichtet. Es ist jedoch 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 "create your first extension"beschrieben wird.

TargetFramework und VssdkCompatibleExtension

Das Erweiterungsprojekt muss 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.

Das Erweiterungsprojekt muss außerdem die Eigenschaft VssdkCompatibleExtension enthalten, die auf true festgelegt ist.

<PropertyGroup>
  <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>

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,
    };

    ...

Paketmanifest

Das Erweiterungsprojekt muss ein Paketmanifest mit dem Namen source.extension.vsixmanifestenthalten. Für das Installation-Tag muss ExtensionType auf VSSDK+VisualStudio.Extensibility festgelegt sein.

<?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>

Verwenden von VisualStudio.Extensibility aus vorhandenen VSSDK-Erweiterungen

Bei vorhandenen VSSDK-Erweiterungen besteht eine weitere Option darin, die VisualStudioExtensibility-Instanz über Dienstanbieter abzufragen und seine Methoden zu verwenden. Mit dieser Methode können Sie die neue API-Oberfläche des VisualStudio.Extensibility SDKs 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 man VisualStudioExtensibility in einem VSSDK-Paket verwenden kann:

  • Fügen Sie in Ihrer .csproj-Datei einen Paketverweis auf VisualStudio.Extensibility-APIs hinzu:
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
  </ItemGroup>
  • Sie können jetzt die VisualStudioExtensibility-Instanz in Ihrem Paket oder anderen Komponenten über die GetServiceAsync-Methode abfragen.
...
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 eine SDK-Formatvorlage .csproj, um VisualStudio.Extensibility SDK-Pakete zu verwenden. Bei vorhandenen Projekten müssen Sie Ihre Dateien mit der Dateierweiterung .csproj möglicherweise auf ein SDK-Format aktualisieren.

  • Entfernen Sie den Paketverweis für Microsoft.VSSDK.BuildTools, und fügen Sie stattdessen Paketverweise für VisualStudio.Extensibility hinzu.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
  • Fügen Sie Ihrer Projektdatei die Eigenschaft VssdkCompatibleExtension hinzu und legen Sie sie auf truefest. Diese Eigenschaft aktiviert einige VSSDK-Features zur Kompatibilität.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • Erstellen Sie eine neue Erweiterungsklasse, die von der Extension-Basisklasse erbt und die RequiresInProcessHosting-Eigenschaft wie zuvor gezeigt festlegt.
  • Ändern Sie die source.extension.vsixmanifest-Datei, indem Sie ExtensionType="VSSDK+VisualStudio.Extensibility" zum Installation-Tag hinzufügen.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

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