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.
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 :
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 :
- 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,
- 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>
- Vous pouvez maintenant interroger l’instance VisualStudioExtensibility par le biais
GetServiceAsync
d’une méthode 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 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 surtrue
. Cette propriété active certaines fonctionnalités VSSDK pour la compatibilité.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
- Créez une classe d’extension qui hérite de la classe de
Extension
base et définissez la propriété RequiresInProcessHosting comme indiqué précédemment.
Vous pouvez désormais utiliser toutes les fonctionnalités de VisualStudio.Extensibility avec votre extension VSSDK existante.