Partage via


Utilisation du Kit de développement logiciel (SDK) VisualStudio.Extensibility et VSSDK ensemble

Bien que le modèle VisualStudio.Extensibility ait été créé principalement pour héberger des extensions en dehors du processus devenv.exe, il est possible d’utiliser les API du Kit de développement logiciel (SDK) VisualStudio.Extensibility dans une extension s’exécutant dans le processus Visual Studio et en utilisant les API d’extensibilité traditionnelles fournies par les packages Microsoft.VisualStudio.Sdk.

La prise en charge de l'utilisation dans le processus est destinée à permettre aux utilisateurs précoces d'accéder aux nouvelles API VisualStudio.Extensibility tout en s'appuyant sur Microsoft.VisualStudio.Sdk pour combler toute lacune fonctionnelle.

Ce document est une procédure pas à pas rapide sur différentes options permettant d’utiliser le Kit de développement logiciel (SDK) VisualStudio.Extensibility in-proc.

  • Si vous développez une nouvelle extension, nous recommandons de créer une extension Visual Studio hébergée dans le processus en suivant ce didacticiel . Cette méthode vous permet d’utiliser toutes les fonctionnalités du Kit de développement logiciel (SDK) VisualStudio.Extensibility, en plus de pouvoir injecter des services VSSDK et MEF.

  • Si vous disposez d’une extension VSSDK existante, vous pouvez suivre ces conseils pour utiliser la nouvelle instance VisualStudioExtensibility dans votre extension.

  • Si vous souhaitez ajouter des commandes, des visualiseurs de débogage, des fenêtres d’outils à votre extension VSSDK existante à l’aide du Kit de développement logiciel (SDK) VisualStudio.Extensibility, vous pouvez vous référer à ces conseils pour héberger une extension VSSDK et une extension VisualStudio.Extensibility dans le même projet d’extension VS.

Créez votre première extension compatible VSSDK pour VisualStudio.Extensibility

Bien que le modèle VisualStudio.Extensibility ait été créé principalement pour héberger des extensions en dehors du processus de devenv.exe, à partir de Visual Studio 2022 17.4 Preview 1, il est possible de créer une extension VisualStudio.Extensibility hébergée dans devenv.exe et peut utiliser des API d’extensibilité traditionnelles fournies par les packages Microsoft.VisualStudio.Sdk.

Conditions préalables

  • Visual Studio 2022 version 17.9 Preview 1 ou ultérieure avec la charge de travail Visual Studio extension development.
  • Si vous effectuez une mise à jour à partir de builds antérieures, veillez à désinstaller VisualStudio.Extensibility Project System pour éviter les conflits potentiels.

Créer le projet d’extension

  • Utilisez l’extension VisualStudio.Extensibility avec le modèle de compatibilité VSSDK pour créer une solution.

Capture d’écran du modèle de projet d’extension interne VisualStudio.Extensibility.

Déboguer votre extension

  • Appuyez sur F5 pour démarrer le débogage, cela génère votre extension et la déploie sur l’instance expérimentale de la version de Visual Studio que vous utilisez. Le débogueur devrait s'attacher une fois que votre extension est chargée.

  • Vous trouverez la commande dans Extensions menu, comme illustré dans l’image suivante :

    Capture d’écran montrant l’exemple de commande d’extension.

Consommation de services sdk Visual Studio à partir d’une extension VisualStudio.Extensibility

Un projet d’extension compatible VS-SDK fait référence au package Microsoft.VisualStudio.Sdk, qui permet d’accéder à tous les services du Kit de développement logiciel (SDK) Visual Studio.

Traditionnellement, ces services sont consommés via MEF ou le AsyncServiceProvider. Un extendeur VisualStudio.Extensibility est plutôt encouragé à injection de dépendances .NET.

Les classes MefInjection<TService> et AsyncServiceProviderInjection<TService, TInterface> (à la fois à partir de l’espace de noms Microsoft.VisualStudio.Extensibility.VSSdkCompatibility) vous permettent d’utiliser les services du Kit de développement logiciel (SDK) Visual Studio en les ajoutant au constructeur d’une classe instanciée par l’injection de dépendances (par exemple, une commande, une fenêtre d’outil ou une partie d’extension).

L’exemple suivant montre comment les services DTE2 et IBufferTagAggregatorFactoryService peuvent être ajoutés à une commande.

    [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 d'une extension Visual Studio Extensibility compatible VSSDK

Lors de l'utilisation de l'extension VisualStudio.Extensibility avec le modèle de compatibilité VSSDK qui prend en charge la configuration de l'ensemble du projet, il est utile de connaître les composants de base d'une extension VisualStudio.Extensibility compatible VS-SDK et comment elle diffère de la variante courante décrite dans le guide « créer votre première extension ».

TargetFramework et VssdkCompatibleExtension

Le projet d’extension doit cibler la version .NET utilisée par la version cible de Visual Studio. Pour Visual Studio 2022, ils doivent cibler .NET Framework 4.7.2.

Le projet d’extension doit également contenir la propriété VssdkCompatibleExtension définie sur true.

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

propriété RequiresInProcessHosting

La classe Extension doit être configurée avec la propriété RequiresInProcessHosting = true qui identifie l’extension comme étant in-process .

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

    ...

Manifeste de paquet

Le projet d’extension doit inclure un manifeste de package nommé source.extension.vsixmanifest. La balise Installation doit avoir le paramètre ExtensionType défini sur 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>

Utiliser VisualStudio.Extensibility à partir d’extensions VSSDK existantes

Pour les extensions VSSDK existantes, une autre option consiste à rechercher la VisualStudioExtensibility instance via le fournisseur de services et à utiliser ses méthodes. Cette méthode vous permet d’utiliser la nouvelle surface d’aire d’API du Kit de développement logiciel (SDK) VisualStudio.Extensibility dans vos composants existants. Cette option peut être utile dans les situations où vous souhaitez utiliser la nouvelle API pour interroger les informations du projet, la gestion des documents sans créer d’extension basée sur VisualStudio.Extensibility.

Voici un exemple d’extrait de code qui montre comment utiliser VisualStudioExtensibility au sein d’un package VSSDK :

  • Dans votre fichier .csproj, incluez une référence de package aux API VisualStudio.Extensibility :
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.2092" />
  </ItemGroup>
  • Vous pouvez désormais interroger l’instance VisualStudioExtensibility via la méthode GetServiceAsync dans votre package ou d’autres composants :
...
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);
        ...
    }
}

Ajouter une extension VisualStudio.Extensibility à un projet d’extension VSSDK existant

Si vous souhaitez également contribuer à des composants tels que des fenêtres d’outils, des écouteurs d’éditeur à l’aide du Kit de développement logiciel (SDK) VisualStudio.Extensibility au sein de votre extension VSSDK existante, vous devez suivre des étapes supplémentaires pour créer une instance d’extension VisualStudio.Extensibility extension dans votre projet.

  • Vous avez besoin d’un style sdk .csproj pour utiliser les packages sdk VisualStudio.Extensibility. Pour les projets existants, vous devrez peut-être mettre à jour votre .csproj vers un format de style kit de développement logiciel (SDK).

  • Supprimez les références de package pour Microsoft.VSSDK.BuildTools et ajoutez plutôt des références de package pour VisualStudio.Extensibility.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" />
  • Ajoutez la propriété VssdkCompatibleExtension à votre fichier de projet, en la définissant sur true. Cette propriété active certaines fonctionnalités VSSDK pour la compatibilité.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    
  • Créez une classe d'extension héritant de la classe de base Extension et définissez la propriété RequiresInProcessHosting comme indiqué précédemment.
  • Modifiez le fichier source.extension.vsixmanifest en ajoutant ExtensionType="VSSDK+VisualStudio.Extensibility" à la balise Installation.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">

Vous pouvez désormais utiliser toutes les fonctionnalités de VisualStudio.Extensibility avec votre extension VSSDK existante.