Extension de Visual Studio pour MacExtending Visual Studio for Mac

Visual Studio pour Mac se compose d’un ensemble de modules appelés Packages d’extension.Visual Studio for Mac consists of a set of modules called Extension Packages. Vous pouvez utiliser des packages d’extension pour introduire une nouvelle fonctionnalité dans Visual Studio pour Mac, comme la prise en charge d’un langage supplémentaire ou d’un nouveau modèle de projet.You can use Extension Packages to introduce new functionality to Visual Studio for Mac, such as support for an additional language or a new Project template.

Les packages d’extension sont créés à partir des points d’extension d’autres packages d’extension.Extension packages build from the extension points of other extension packages. Les points d’extension sont des espaces réservés pour des zones sur lesquelles les développements peuvent s’appuyer, par exemple un menu ou la liste des commandes de l’IDE.Extension points are placeholders for areas that can be expanded upon, such as a menu or the list of IDE Commands. Un package d’extension peut être créé à partir d’un point d’extension en inscrivant un nœud de données structurées appelé « extension », comme un nouvel élément de menu ou une nouvelle commande.An extension package can build from an extension point by registering a node of structured data called an extension, such as a new menu item or a new Command. Chaque point d’extension accepte certains types d’extensions, comme une Commande, Panneau ou FileTemplate.Each extension point accepts certain types of extensions, such as a Command, Pad, or FileTemplate. Un module qui contient des points d’extension est appelé un hôte de compléments, car il peut être étendu par d’autres packages d’extension.A module that contains extension points is called an add-in host, as it can be extended by other extension packages.

Pour personnaliser Visual Studio pour Mac, vous pouvez créer un package d’extension qui est créé à partir de points d’extension contenus dans les hôtes de compléments de bibliothèques préexistantes dans Visual Studio pour Mac, comme illustré dans le diagramme suivant :To customize Visual Studio for Mac, you can create an extension package that builds from extension points contained in add-in hosts within pre-existing libraries in Visual Studio for Mac, as illustrated by the following diagram:

Architecture des compléments

Pour qu’un package d’extension soit créé à partir de Visual Studio pour Mac, il doit avoir des extensions qui sont créées à partir de points d’extension préexistants dans l’IDE Visual Studio pour Mac.In order for an extension package to build from Visual Studio for Mac, it must have extensions that build from pre-existing extension points within the Visual Studio for Mac IDE. Quand un package d’extension s’appuie sur un point d’extension défini dans un hôte de compléments, il est dit avoir une dépendance de ce package d’extension.When an extension package relies on an extension point defined in an add-in host, it is said to have a dependency on that extension package.

L’avantage de cette conception modulaire est que Visual Studio pour Mac est extensible : il existe de nombreux points d’extension sur lesquels peuvent être créés des packages d’extension personnalisés.The benefit of this modular design is that Visual Studio for Mac is extensible -- there are many extension points that can be built upon with custom extension packages. La prise en charge de C# et de F#, des outils de débogage et des modèles de projet sont des exemples de packages d’extension existants.Examples of current extension packages include support for C# and F#, debugger tools, and Project templates.

Note

Remarque : Si vous avez un projet Add-in Maker créé avant Add-in Maker 1.2, vous devez migrer votre projet, comme indiqué dans les étapes décrites ici.Note: If you have an Add-in Maker project that was created before Add-in Maker 1.2, you need to migrate your project as outlined in the steps here.

Cette section présente les différents fichiers générés par Add-in Maker et les données nécessaires à une extension de commande.This section looks at the different files generated by the Add-in Maker and the data a command extension requires.

Fichiers d’attributsAttribute files

Les packages d’extension stockent des métadonnées sur leur nom, leur version, leurs dépendances et d’autres informations dans des attributs C#.Extension packages store metadata about their name, version, dependencies, and other information in C# attributes. Add-in Maker crée deux fichiers, AddinInfo.cs et AssemblyInfo.cs, pour stocker et organiser ces informations.The Add-in Maker creates two files, AddinInfo.cs and AssemblyInfo.cs to store and organize this information. Les packages d’extension doivent avoir un ID et un espace de noms uniques spécifiés dans leur attribut Addin :Extension packages must have a unique id and namespace specified in their Addin attribute:

[assembly:Addin (
   "DateInserter",
   Namespace = "DateInserter",
   Version = "1.0"
)]

Ils doivent également déclarer les dépendances des packages d’extension qui ont les points d’extension auxquels ils se connectent.Extension packages must also declare dependencies on the extension packages that own the extension points they plug into. Ceux-ci sont référencés automatiquement au moment de la génération.These are automatically referenced at build time.

De plus, des références supplémentaires peuvent être ajoutées via le nœud Référence de complément dans le panneau Solution pour le projet, comme illustré par l’image suivante :Furthermore, additional references can be added via the Add-in reference node in the solution pad for the project, as depicted by the following image:

Capture d’écran - Insérer la date

Leurs attributs assembly:AddinDependency correspondants sont également ajoutés au moment de la génération.They also have their corresponding assembly:AddinDependency attributes added at build time. Une fois que les métadonnées et les déclarations de dépendance sont en place, vous pouvez vous concentrer sur les blocs de construction essentiels du package d’extension.Once the metadata and dependency declarations are in place, you can focus on the essential building blocks of the extension package.

Extensions et points d’extensionExtensions and extension points

Un point d’extension est un espace réservé qui définit une structure de données (un type), tandis qu’une extension définit les données qui se conforment à une structure spécifiée par un point d’extension spécifique.An extension point is a placeholder that defines a data structure (a type), while an extension defines data that conforms to a structure specified by a specific extension point. Les points d’extension spécifient dans leur déclaration les types d’extension qu’ils peuvent accepter.Extension points specify what type of extension they can accept in their declaration. Les extensions sont déclarées via des noms de types ou des chemins d’extension.Extensions are declared using type names or extension paths. Pour une explication plus approfondie sur la création du point d’extension dont vous avez besoin, consultez les Informations de référence sur les points d’extension.See the Extension Point reference for a more in-depth explanation on how to create the extension point that you need.

L’architecture extension/point d’extension rend le développement de Visual Studio pour Mac rapide et modulable.The extension/extension point architecture keeps the development of Visual Studio for Mac fast and modular.

Extensions de commandeCommand Extensions

Les extensions de commande sont des extensions qui pointent vers des méthodes appelées chaque fois qu’elles sont exécutées.Command Extensions are extensions that point to methods that are called every time it is executed.

Les extensions de commande sont définies en ajoutant des entrées au point d’extension /MonoDevelop/Ide/Commands.Command Extensions are defined by adding entries to the /MonoDevelop/Ide/Commands extension point. Nous avons défini notre extension dans Manifest.addin.xml avec le code suivant :We defined our extension in Manifest.addin.xml with the following code:

<Extension path="/MonoDevelop/Ide/Commands/Edit">
 <command id="DateInserter.DateInserterCommands.InsertDate"
           _label="Insert Date"
           _description="Insert the current date"
           defaulthandler="DateInserter.InsertDateHandler" />
</Extension>

Le nœud de l’extension contient un attribut path qui spécifie le point d’extension auquel elle se connecte, dans ce cas /MonoDevelop/Ide/Commands/Edit.The extension node contains a path attribute that specifies the extension point that it is plugging into, in this case /MonoDevelop/Ide/Commands/Edit. Il agit également comme nœud parent de la commande.Additionally, it acts as a parent node to the Command. Le nœud Commande a les attributs suivants :The Command node has the following attributes:

  • id : spécifie l’identificateur pour cette commande.id - Specifies the identifier for this Command. Les identificateurs de commande doivent être déclarés comme membres d’énumération, et ils sont utilisés pour connecter des commandes à des éléments de commande.Command Identifiers must be declared as enumeration members, and are used to connect Commands to CommandItems.
  • _label : texte à afficher dans les menus._label - The text to be shown in menus.
  • _description : texte à afficher comme info-bulle pour les boutons de la barre d’outils._description - The text to be shown as a tooltip for toolbar buttons.
  • defaultHandler : spécifie la classe CommandHandler qui sert de base à la commande.defaultHandler - Specifies the CommandHandler class that powers the Command

L’extrait de code suivant illustre une extension CommandItem qui se connecte au point d’extension /MonoDevelop/Ide/MainMenu/Edit :A CommandItem extension that plugs into the /MonoDevelop/Ide/MainMenu/Edit extension point is demonstrated in the following code snippet:

<Extension path="/MonoDevelop/Ide/MainMenu/Edit">
  <commanditem id="DateInserter.DateInserterCommands.InsertDate" />
</Extension>

Un élément de commande place une commande spécifiée dans son attribut id dans un menu.A CommandItem places a Command specified in its id attribute into a menu. Cet élément de commande étend le point d’extension /MonoDevelop/Ide/MainMenu/Edit, ce qui fait apparaître le libellé de la commande dans le menu Edition.This CommandItem is extending the /MonoDevelop/Ide/MainMenu/Edit extension point, which makes the Command's label appear in the Edit Menu. Notez que l’id dans l’élément de commande correspond à l’ID du nœud Commande, InsertDate.Note that the id in the CommandItem corresponds to the id of the Command node, InsertDate. Si vous supprimez l’élément de commande, l’option Insérer la date disparaît du menu Edition.If you were to remove the CommandItem, the Insert Date option would disappear from the Edit Menu.

Gestionnaires de commandesCommand Handlers

L’extension InsertDateHandler est une extension de la classe CommandHandler.The InsertDateHandler is an extension of the CommandHandler class. Elle remplace deux méthodes, Update et Run.It overrides two methods, Update and Run. Une requête est faite à la méthode Update chaque fois qu’une commande est affichée dans un menu ou exécutée via des combinaisons de touches.The Update method is queried whenever a Command is shown in a menu or executed via key bindings. En modifiant l’objet info, vous pouvez désactiver la commande ou la rendre invisible, remplir des commandes de tableau, etc.By changing the info object, you can disable the Command or make it invisible, populate array commands, and more. Cette méthode Update désactive la commande si elle ne peut pas trouver un Document actif avec un éditeur de texte pour y insérer du texte :This Update method disables the command if it can't find an active Document with a TextEditor to insert text into:

protected override void Update (CommandInfo info)
{
    info.Enabled = IdeApp.Workbench.ActiveDocument?.Editor != null;
}

Vous devez remplacer la méthode Update seulement quand vous avez une logique spéciale pour activer ou masquer la commande.You only need to override the Update method when you have special logic for enabling or hiding the Command. La méthode Run s’exécute chaque fois qu’un utilisateur exécute une commande, ce qui dans ce cas se produit quand un utilisateur sélectionne la commande dans le menu Edition.The Run method executes whenever a user executes a Command, which in this case occurs when a user selects the Command from the Edit Menu. Cette méthode insère la date et l’heure au point d’insertion dans l’éditeur de texte :This method inserts the date and time at the caret in the text editor:

protected override void Run ()
{
  var editor = IdeApp.Workbench.ActiveDocument.Editor;
  var date = DateTime.Now.ToString ();
  editor.InsertAtCaret (date);
}

Déclarez le type de commande comme membre d’énumération dans DateInserterCommands :Declare the Command type as an enumeration member within DateInserterCommands:

public enum DateInserterCommands
{
  InsertDate,
}

Ceci lie la commande et l’élément de commande : l’élément de commande appelle la commande quand il est sélectionné dans le menu Edition.This ties together the Command and CommandItem - the CommandItem calls the Command when the CommandItem is selected from the Edit Menu.

API de l’IDEIDE APIs

Pour plus d’informations sur l’étendue de ce qui peut faire l’objet de développements, consultez Extension Tree Reference et API Overview.For information on the scope of areas that are available for development, see the Extension Tree Reference and the API Overview. Si vous créez des packages d’extension avancés, reportez-vous aussi à Developer Articles.When building advanced extension packages, also refer to Developer Articles. Voici une liste partielle des éléments que vous pouvez personnaliser :Below is a partial list of areas for customization:

  • PanneauxPads
  • Schémas de combinaisons de touchesKey Binding Schemes
  • StratégiesPolicies
  • Formateurs de codeCode formatters
  • Formats de fichiers projetProject file formats
  • Panneaux de préférencesPreferences panels
  • Panneaux d’optionsOptions Panels
  • Protocoles du débogueurDebugger Protocols
  • Visualiseurs du débogueurDebugger visualizers
  • Dispositions d’espace de travailWorkspace layouts
  • Nœuds d’arborescence de panneau de solutionSolution pad tree nodes
  • Marges de l’éditeur de codeSource editor margins
  • Moteurs de tests unitairesUnit test engines
  • Générateurs de codeCode generators
  • Extraits de codeCode snippets
  • Versions cibles de .NET FrameworkTarget frameworks
  • Runtime cibleTarget runtime
  • Back-ends de système de contrôle de versionVCS back-ends
  • RefactorisationRefactoring
  • Gestionnaires d’exécutionExecution handlers
  • Mise en surbrillance de la syntaxeSyntax highlighting

Informations supplémentairesAdditional Information

Note

Nous travaillons actuellement à améliorer les scénarios d’extensibilité pour Visual Studio pour Mac.We are currently working on improving the extensibility scenarios for Visual Studio for Mac. Si vous créez des extensions et que vous avez besoin d’aide ou d’informations supplémentaires, ou que vous avez des commentaires à partager, veuillez remplir le formulaire Création d’extensions Visual Studio pour Mac.If you are creating extensions and need additional help or information, or would like to provide feedback, please fill in the Visual Studio for Mac Extension Authoring form.