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.
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 :
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 surtrue
. 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 ajoutantExtensionType="VSSDK+VisualStudio.Extensibility"
à la baliseInstallation
.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
Vous pouvez désormais utiliser toutes les fonctionnalités de VisualStudio.Extensibility avec votre extension VSSDK existante.