Partager 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 exécutée 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 in-proc 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 couvrir tout écart de fonctionnalité.

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, notre méthode recommandée consiste à créer une extension VisualStudio.Extension hébergée dans le processus suivant ce tutoriel. 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 à la fois une extension VSSDK et une extension VisualStudio.Extensibility dans le même projet d’extension VS.

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

Bien que le modèle VisualStudio.Extensibility ait été créé principalement pour héberger des extensions en dehors du processus 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 .

Prérequis

  • Visual Studio 2022 version 17.9 Preview 1 ou ultérieure avec la Visual Studio extension development charge de travail.
  • 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é du Kit de développement logiciel (SDK) VS pour créer une solution.

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

Déboguer votre extension

  • Définissez le projet conteneur en tant que projet de démarrage, appuyez F5 pour démarrer le débogage.

  • Appuyez sur F5 générer votre extension et la déploie sur l’instance expérimentale de la version de Visual Studio que vous utilisez. Le débogueur doit être attaché une fois votre extension chargée.

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

    Screenshot showing sample extension command.

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 AsyncServiceProvider. Un extendeur VisualStudio.Extensibility est plutôt encouragé à l’injection de dépendances .NET.

Les MefInjection<TService> classes AsyncServiceProviderInjection<TService, TInterface> (à la fois à partir de l’espace Microsoft.VisualStudio.Extensibility.VSSdkCompatibility de noms) 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 ajouter les services et IBufferTagAggregatorFactoryService les DTE2 services à 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 VisualStudio.Extensibility compatible VSSDK

Lors de l’utilisation de l’extension VisualStudio.Extensibility avec le modèle de compatibilité du KIT DE développement logiciel (SDK) VS, il est utile de savoir quels sont les composants de base d’une extension VisualStudio.Extensibility compatible VS-SDK et comment elle diffère de la variante commune décrite dans le guide « créer votre première extension ».

Projet conteneur

Une solution VisualStudio.Extensibility compatible VS-SDK se compose de deux projets :

  1. bibliothèque de classes qui fait référence aux packages du Kit de développement logiciel (SDK) VisualStudio.Extensibility et Visual Studio et contient tout le code de l’extension,
  2. un projet VSIX conteneur que vous utilisez pour déployer et déboguer l’extension.

Cette séparation est une solution temporaire alors que VisualStudio.Extensibility est en préversion et que la conception finale de l’empaquetage et du déploiement est finalisée.

L’extendeur ne doit pas ajouter de code, de contenu ou de ressources au projet de conteneur. Le seul objectif du projet conteneur est d’inclure les ressources fournies par l’autre projet.

TargetFramework

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

NécessiteInProcessHosting, propriété

La Extension classe doit être configurée avec la RequiresInProcessHosting = true propriété qui identifie l’extension comme étant en cours de traitement.

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

    ...

Utiliser VisualStudio.Extensibility à partir d’extensions VSSDK existantes

Pour les extensions VSSDK existantes, une autre option consiste à interroger l’instance VisualStudioExtensibility 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 un package VSSDK :

  • Dans votre .csproj fichier, incluez une référence de package aux API VisualStudio.Extensibility :
  <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);
        ...
    }
}

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 dans votre extension VSSDK existante, vous devez suivre des étapes supplémentaires pour créer une instance d’extension VisualStudio.Extensibility dans votre projet.

  • Vous avez besoin d’un style .csproj sdk pour utiliser les packages sdk VisualStudio.Extensibility. Pour les projets existants, vous devrez peut-être mettre à jour votre .csproj projet vers un style sdk 1.

  • 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.23-preview-1" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
  • Ajoutez VssdkCompatibleExtension une propriété à votre fichier projet, en le définissant sur true. Cette propriété active certaines fonctionnalités VSSDK pour la compatibilité.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    

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