Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Ce document est un guide de démarrage rapide qui montre comment créer votre première extension à l’aide de VisualStudio.Extensibility. L’extension s’exécute hors processus, ce qui signifie en dehors du processus de Visual Studio.
Prerequisites
- Visual Studio 2026 version 18.11 ou ultérieure avec la charge de travail Développement d’extensions Visual Studio est recommandée. Pour les versions antérieures, VisualStudio.Extensibility nécessite Visual Studio 2022 version 17.9 ou ultérieure.
Créer le projet d’extension
Visual Studio 18.11 ou version ultérieure (recommandé)
Utilisez le modèle Projet VSIX moderne et sélectionnez VisualStudio.Extensibility (Out-Of-Process) sous Type d’extension. Le modèle est défini par défaut sur VSSDK. Sélectionnez donc l’option out-of-process pour ce guide de démarrage rapide.
Suivez les instructions de Créer une extension avec le modèle Projet VSIX moderne pour découvrir les étapes de l'Assistant et les options du SDK de projet.
Versions antérieures Visual Studio
Utilisez le modèle VisualStudio.Extensibility Project pour créer un projet d’extensibilité.
À ce stade, vous êtes prêt à commencer à étendre Visual Studio en ajoutant des commandes et des composants d'éditeur à votre extension.
La classe Extension
Le modèle crée une classe qui s’étend Extension ↗ . Cette classe est la première à être instanciée lorsque votre extension est chargée. Dans la InitializeServices ↗ méthode, vous pouvez ajouter vos propres services à la collection de services pour les rendre disponibles pour l’injection de dépendances.
[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
public override ExtensionConfiguration ExtensionConfiguration => new()
{
Metadata = new(
id: "MyExtension.abc123",
version: this.ExtensionAssemblyVersion,
publisherName: "My Company",
displayName: "My Extension"),
};
protected override void InitializeServices(IServiceCollection serviceCollection)
{
base.InitializeServices(serviceCollection);
// You can configure dependency injection here by adding services to the serviceCollection.
}
}
Vous pouvez également voir l’attribut VisualStudioContribution ↗ utilisé pour marquer les composants d’extension destinés à être consommés par Visual Studio. Cet attribut peut être appliqué aux classes implémentant IVisualStudioContributionClass ↗ ou aux propriétés statiques d’un type implémentant IVisualStudioContributionProperty ↗.
Ajouter votre première commande
Le modèle crée Command1.cs en tant que premier gestionnaire de commandes, que vous pouvez utiliser comme point de départ. Étant donné que nous voulons faire en sorte que Visual Studio prenne connaissance de cette commande et que la classe Command ↗ implémente IVisualStudioContributionClass ↗, la commande est marquée avec l’attribut VisualStudioContribution.
[VisualStudioContribution]
internal class Command1 : Command
{
La commande a une propriété de configuration nommée CommandConfiguration ↗ , qui définit son nom d’affichage, son icône et son positionnement sous le Extensions menu.
public override CommandConfiguration CommandConfiguration => new("%MyExtension.Command1.DisplayName%")
{
// Use this object initializer to set optional parameters for the command. The required parameter,
// displayName, is set above. DisplayName is localized and references an entry in .vsextension\string-resources.json.
Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
};
Les propriétés de configuration sont évaluées par le compilateur C# lors de la génération de l’extension et leurs valeurs sont enregistrées en tant que métadonnées d’extension afin que Visual Studio puissent la lire sans charger l’assembly d’extension. Pour cette raison, les propriétés de configuration ont des restrictions supplémentaires par rapport aux propriétés normales (par exemple, elles doivent être lues en lecture seule).
Vous pouvez voir que le nom d’affichage de la commande est "%MyExtension.Command1.DisplayName%", qui fait référence à la chaîne MyExtension.Command1.DisplayName dans le fichier .vsextension/string-resources.json, ce qui permet de localiser cette chaîne.
Lorsque la commande est exécutée, Visual Studio appelle la méthode ExecuteCommandAsync ↗, dans laquelle vous pouvez placer un point d'arrêt. Vous pouvez utiliser l’argument context ou this.Extensibility pour interagir avec Visual Studio.
Par exemple, un gestionnaire de commandes peut être le suivant :
public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
await this.Extensibility.Shell().ShowPromptAsync(
"Hello from an extension!",
PromptOptions.OK,
cancellationToken);
}
Pour plus d’informations sur l’ajout de commandes, reportez-vous à la section Commandes .
Déboguer votre extension
Vérifiez que votre projet d’extension est sélectionné comme projet de démarrage dans Visual Studio, puis appuyez sur
F5pour démarrer le débogage.Appuyez sur
F5pour générer votre extension et la déployer dans l'instance expérimentale de la version de Visual Studio que vous utilisez. Le débogueur devrait se connecter dès que votre extension est chargée.Vous trouverez la nouvelle commande dans
Extensionsle menu, comme illustré dans l’image suivante :
Étapes suivantes
- Ajouter une commande — la fonctionnalité la plus courante à développer en premier.
- Fenêtres Outils — ajouter des panneaux d'interface utilisateur personnalisés.
- Anatomie d’une extension : comprendre la structure du projet et les concepts clés
- Parcourir tous les exemples ↗ : extensions de travail complètes sur GitHub