Delen via


VisualStudio.Extensibility SDK en VSSDK samen gebruiken

Hoewel het VisualStudio.Extensibility-model voornamelijk is gemaakt voor het hosten van extensies buiten het devenv.exe proces, is het mogelijk om VisualStudio.Extensibility SDK-API's te gebruiken in een extensie die wordt uitgevoerd in het Visual Studio-proces en om traditionele uitbreidbaarheids-API's te gebruiken die worden geleverd door de Microsoft.VisualStudio.Sdk-pakketten.

De ondersteuning van in-proc gebruik is bedoeld om early adopters in staat te stellen de nieuwe VisualStudio.Extensibility-API's te gebruiken, terwijl ze vertrouwen op Microsoft.VisualStudio.Sdk om eventuele functietekorten op te vangen.

Dit document is een beknopt overzicht van verschillende opties voor het gebruik van VisualStudio.Extensibility SDK in-proc.

  • Als u een nieuwe extensie ontwikkelt, is de aanbevolen methode om een VisualStudio.Extension te maken die in-proces wordt gehost volgens deze handleiding . Met deze methode kunt u volledige mogelijkheden van VisualStudio.Extensibility SDK gebruiken, naast het injecteren van VSSDK- en MEF-services.

  • Als u een bestaand VSSDK-extensie hebt, kunt u deze tips volgen om de nieuwe VisualStudioExtensibility instantie in uw extensie te gebruiken.

  • Als u opdrachten, foutopsporings visualiseren, hulpprogrammavensters wilt toevoegen aan uw bestaande VSSDK-extensie met behulp van de VisualStudio.Extensibility SDK, kunt u verwijzen naar deze tips om zowel een VSSDK-extensie als een VisualStudio.Extensibility-extensie in hetzelfde VS-extensieproject te hosten.

Uw eerste VSSDK-compatibele VisualStudio.Extensibility-extensie maken

Hoewel het VisualStudio.Extensibility-model voornamelijk is gemaakt voor het hosten van extensies buiten het devenv.exe proces, kunt u vanaf Visual Studio 2022 17.4 Preview 1 een VisualStudio.Extensibility-extensie bouwen die wordt gehost in devenv.exe en traditionele uitbreidbaarheids-API's kunnen gebruiken die worden geleverd door de Microsoft.VisualStudio.Sdk-pakketten.

Voorwaarden

  • Visual Studio 2022 versie 17.9 Preview 1 of hoger met de Visual Studio extension development workload.
  • Als u een update uitvoert van eerdere builds, moet u VisualStudio.Extensibility Project System verwijderen om mogelijke conflicten te voorkomen.

Het extensieproject maken

  • Gebruik de VisualStudio.Extensibility Extension met VSSDK Compatibility sjabloon om een nieuwe oplossing te maken.

Schermopname van de VisualStudio.Extensibility in-process extension-projectsjabloon.

Fouten opsporen in uw extensie

  • Druk op F5 om foutopsporing te starten. Hiermee wordt uw extensie gebouwd en geïmplementeerd in het experimentele exemplaar van de Visual Studio-versie die u gebruikt. De debugger zou moeten koppelen zodra uw extensie is geladen.

  • U vindt de opdracht in Extensions menu, zoals wordt weergegeven in de volgende afbeelding:

    Schermopname met een voorbeeld van de extensie-opdracht.

Visual Studio SDK-services gebruiken vanuit een VisualStudio.Extensibility-extensie

Een vs-SDK-compatibel uitbreidingsproject verwijst naar het Microsoft.VisualStudio.Sdk-pakket, waarmee toegang tot alle services van Visual Studio SDK mogelijk is.

Dergelijke services worden traditioneel gebruikt via MEF- of de AsyncServiceProvider. Een VisualStudio.Extensibility-extender wordt aangemoedigd om in plaats daarvan .NET-afhankelijkheidsinjectiete gebruiken.

Met de MefInjection<TService>- en AsyncServiceProviderInjection<TService, TInterface>-klassen (beide uit de Microsoft.VisualStudio.Extensibility.VSSdkCompatibility naamruimte) kunt u de services van de Visual Studio SDK gebruiken door deze toe te voegen aan de constructor van een klasse die wordt geïnstantieerd via afhankelijkheidsinjectie (zoals een opdracht, taakvenster of extensieonderdeel).

In het volgende voorbeeld ziet u hoe de services DTE2 en IBufferTagAggregatorFactoryService kunnen worden toegevoegd aan een opdracht.

    [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 van een VSSDK-compatibele VisualStudio.Extensibility-extensie

Tijdens het gebruik van de VisualStudio.Extensibility Extension met VSSDK Compatibility sjabloon zorgt voor het instellen van het hele project, is het handig om te weten wat de basisonderdelen zijn van een VS-SDK-compatibele VisualStudio.Extensibility-extensie en hoe deze verschilt van de algemene variant die wordt beschreven in de handleiding 'uw eerste extensie maken'.

TargetFramework en VssdkCompatibleExtension

Het extensieproject moet gericht zijn op de .NET-versie die wordt gebruikt door de Visual Studio-doelversie. Voor Visual Studio 2022 moeten ze zich richten op .NET Framework 4.7.2.

Het extensieproject moet ook de eigenschap VssdkCompatibleExtension bevatten die is ingesteld op true.

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

De eigenschap RequiresInProcessHosting

De Extension-klasse moet worden geconfigureerd met de eigenschap RequiresInProcessHosting = true waarmee de extensie wordt geïdentificeerd als in-process.

[VisualStudioContribution]
internal class MyExtension : Extension
{
    public override ExtensionConfiguration? ExtensionConfiguration => new()
    {
        RequiresInProcessHosting = true,
    };

    ...

Pakketmanifest

Het uitbreidingsproject moet een pakketmanifest bevatten met de naam source.extension.vsixmanifest. De Installation-tag moet ExtensionType zijn ingesteld op 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>

VisualStudio.Extensibility gebruiken vanuit bestaande VSSDK-extensies

Voor bestaande VSSDK-extensies kunt u ook zoeken naar de VisualStudioExtensibility instantie via service provider en de methoden gebruiken. Met deze methode kunt u nieuwe api-surface area van VisualStudio.Extensibility SDK gebruiken in uw bestaande onderdelen. Deze optie kan handig zijn in situaties waarin u de nieuwe API wilt gebruiken om projectgegevens op te vragen, documentbeheer zonder een nieuwe visualStudio.Extensibility-extensie te maken.

Hier volgt een voorbeeldcodefragment dat laat zien hoe u VisualStudioExtensibility in een VSSDK-pakket kunt gebruiken:

  • Neem in uw .csproj-bestand een pakketreferentie op naar VisualStudio.Extensibility-API's:
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
  </ItemGroup>
  • U kunt nu zoeken naar een VisualStudioExtensibility exemplaar met de GetServiceAsync methode in uw pakket of andere componenten.
...
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);
        ...
    }
}

Een VisualStudio.Extensibility-extensie toevoegen aan een bestaand VSSDK-extensieproject

Als u ook onderdelen wilt bijdragen, zoals hulpprogrammavensters, editor-listeners met behulp van de VisualStudio.Extensibility SDK binnen uw bestaande VSSDK-extensie, moet u meer stappen uitvoeren om een VisualStudio.Extensibility Extension-exemplaar in uw project te maken.

  • U hebt een SDK-stijl nodig .csproj om VisualStudio.Extensibility SDK-pakketten te kunnen gebruiken. Voor bestaande projecten moet u mogelijk uw .csproj bijwerken naar een SDK-stijl.

  • Verwijder pakketverwijzing voor Microsoft.VSSDK.BuildTools en voeg in plaats daarvan pakketverwijzingen toe voor VisualStudio.Extensibility.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" PrivateAssets="all" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" PrivateAssets="all" />
  • Voeg VssdkCompatibleExtension eigenschap toe aan uw projectbestand en stel deze in op true. Met deze eigenschap worden sommige VSSDK-functies ingeschakeld voor compatibiliteit.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • Maak een nieuwe extensieklasse die wordt overgenomen van Extension basisklasse en stel eigenschap RequiresInProcessHosting in, zoals eerder wordt weergegeven.
  • Wijzig het source.extension.vsixmanifest bestand dat ExtensionType="VSSDK+VisualStudio.Extensibility" toevoegt aan de Installation-tag.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

U kunt nu alle mogelijkheden van VisualStudio.Extensibility gebruiken samen met uw bestaande VSSDK-extensie.