0

Je suis relativement nouveau dans le développement d'une extension pour Visual Studio IDE. Je l'apprends des documents officiels de Microsoft.Comment ajouter un menu aux outils dans Visual Studio?

Cependant, je ne pouvais pas comprendre comment faire un nouveau menu.

J'ai déjà ajouté à l'outil mais j'aimerais ajouter un nouveau menu qui contient mes outils.

Dans les documents Microsoft, il y a beaucoup de choses comme des groupes, des boutons et des menus. Cependant, je ne pouvais pas comprendre la hiearchy entre eux surtout des liens avec des ID.

Quelqu'un peut-il expliquer comment cela fonctionne?

Merci à l'avance

+0

Essayez-vous de créer un menu de niveau supérieur, d'ajouter un sous-menu à un menu existant ou simplement d'ajouter un élément de menu? –

Répondre

1

ressources: Reference Page

  1. Ajouter un fichier de ressources de menu commandes de menu Visual Studio sont compilés à partir de fichiers .vsct, qui sont compilés par le compilateur VSCT dans les ressources .ctmenu incorporées dans la DLL. Pour commencer, vous devez ajouter un fichier .vsct (le nom n'a pas d'importance) à votre projet en tant que tag <VSCTCompile>. Cela doit être fait en éditant le fichier de projet directement. Vous aurez également besoin d'ajouter un fichier VSPackage.resx vide pour le compilateur VSCT pour intégrer la ressource compilée dans

Les modifications de fichiers de projet (les ajouter dans une <ItemGroup>) sont les suivantes: xml <VSCTCompile Include="YourName.vsct"> <ResourceName>Menus.ctmenu</ResourceName> </VSCTCompile> <EmbeddedResource Include="VSPackage.resx"> <MergeWithCTO>true</MergeWithCTO> <ManifestResourceName>VSPackage</ManifestResourceName> </EmbeddedResource>

Le contenu du VSCT devrait ressembler à ceci:

<?xml version="1.0" encoding="utf-8"?> 
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <Extern href="stdidcmd.h"/> 
    <Extern href="vsshlids.h"/> 
    <Commands package="PackageGuid"> 
     <Buttons> 
      <Button guid="CommandsGuid" id="MyCommand" priority="0x0101" type="Button"> 
      <Parent guid="guidSHLMainMenu" id="IDG_VS_CODEWIN_NAVIGATETOLOCATION"/> 
      <Icon guid="guidObjectBrowserButtons" id="15"/> 

      <Strings> 
       <ButtonText>My &amp;Powerful Command</ButtonText> 
      </Strings> 
      </Button> 
     </Buttons> 
    </Commands> 

    <Symbols> 
     <GuidSymbol name="PackageGuid" value="«Package GUID»" /> 

     <GuidSymbol name="CommandsGuid" value="«Command Group GUID»"> 
      <IDSymbol name="MyCommand" value="0" /> 
     </GuidSymbol> 
    </Symbols> 
</CommandTable> 

la commande des valeurs d'identification doit être unique au sein de chaque groupe de commande (GUID), de sorte que vous ne pas besoin de se soucier entrer en collision avec d'autres commandes.

L'entrée <Parent> spécifie le groupe dans lequel la commande doit être placée; Vous pouvez trouver tous les groupes standard dans Program Files \ Microsoft Visual Studio 12.0 \ VSSDK \ VisualStudioIntegration \ Common \ Inc \ vsshlids.h. Vous pouvez également trouver une liste de tous les ID de commande dans stdidcmd.h dans le même dossier.

  1. Définir un VSPackage pour Visual Studio pour charger Pour Visual Studio charger votre fichier de commande de menu, vous devez définir un VSPackage au sein de votre Addin et l'enregistrer dans le VSIX.

D'abord, ajoutez le fichier de code suivant (le nom de la classe n'a pas d'importance):

using System; 
using System.Runtime.InteropServices; 
using Microsoft.VisualStudio.Shell; 

namespace YourAddin.Namespace { 
    // These GUIDS and command IDs must match the VSCT. 
    [ProvideMenuResource("Menus.ctmenu", 1)] 
    [Guid("«Package GUID»")] 
    [PackageRegistration(UseManagedResourcesOnly = true)] 
    class YourAddinPackage : Package { 
    } 

    [Guid("«Command Group GUID»")] 
    enum YourAddinCommand { 
     MyCommand = 0 
    } 
} 

Les attributs de la classe package dire CreatePkgDef.exe (qui est invoqué par le compilateur VSIX) comment émet un fichier .pkgdef dans votre addin qui définit les clés de registre appropriées pour enregistrer l'addin et sa ressource de menu avec le système addin basé sur COM de Visual Studio. Ceci est complètement indépendant de l'enregistrement MEF pour les addins gérés.

L'énumération et son attribut [Guid] sont simplement un moyen pratique de garder une trace du GUID et des identifiants de commande; vous êtes libre d'utiliser une approche différente si vous le souhaitez.

Vous devez également dire VSIX d'inclure le paquet et générer le fichier pkgdef en ajoutant la ligne suivante à l'élément <Content> dans votre source.extension.vsixmanifest:

<VsPackage>|%CurrentProject%;PkgdefProjectOutputGroup|</VsPackage> 

Si vous utilisez la concepteur (pour la version 2 VSIXes), allez dans la section Assets, cliquez sur Nouveau, sélectionnez Microsoft.VisualStudio.VsPackage, un projet dans la solution actuelle et sélectionnez votre projet.

  1. corriger la configuration du projet Enfin, vous devez apporter quelques modifications au fichier csproj pour enregistrer correctement le Addin:

D'abord, supprimer <GeneratePkgDefFile>false</GeneratePkgDefFile> si elle est présente pour dire au compilateur VSIX de générer un pkgdef pour enregistrer votre paquet. Les addins purement basés sur MEF n'ont pas du tout besoin de fichiers pkgdef, donc la plupart des modèles de projets l'ajouteront, mais une fois que vous aurez créé un VSPackage, vous aurez besoin d'un pkgdef pour l'enregistrer avec le chargeur addin COM de Visual Studio.

Ensuite, ajoutez le balisage suivant ne importe où dans l'élément racine (pas dans un <ItemGroup>): xml <PropertyGroup> <UseCodebase>true</UseCodebase> </PropertyGroup>

VSPackages sont en fait des DLL COM qui sont enregistrés dans la clé de configuration de ruche Visual Studio et chargés à l'aide des pratiques normales COM. Les VSPackages gérés sont chargés en utilisant COM interop; ils sont enregistrés en tant que mscoree.dll, qui recherche ensuite un assembly géré à charger à partir de la même clé de registre. Par défaut, le créateur PkgDef émettra "Assembly" = "YourAssemblyName", que mscoree essayera de charger en utilisant le chargeur d'assembly .Net standard. Sauf si votre DLL VSPackage est dans le GAC (ce qui ne sera pas le cas), cela ne fonctionnera pas, et VS refusera silencieusement de charger votre paquet. Le réglage <UseCodebase> dans le fichier projet le fera "CodeBase" = "$ PackageFolder $ \ YourAddin.dll" ($ PackageFolder $ est substitué au chemin DLL réel lorsque le VSIX est installé), ce qui indique à mscoree le chemin exact pour le charger de.

  1. Mettre en oeuvre la commande

Après avoir fait tout cela, votre commande devrait apparaître lorsque vous appuyez sur F5 dans le Addin (en cours d'exécution dans l'instance expérimentale). Cependant, vous devez toujours implémenter la commande afin que quelque chose se passe lorsque le bouton est cliqué.

Pour les commandes globales, la façon de le faire plus simple cela est de remplacer la méthode initialize() dans votre package et ajouter du code comme le suivant:

var mcs = (OleMenuCommandService) GetService(typeof(IMenuCommandService)); 
var commandId = new CommandID(typeof(YourAddinCommand).GUID, (int)YourAddinCommand.MyCommand)); 
mcs.AddCommand(new MenuCommand(delegate { 
    MessageBox.Show("You clicked me!"); 
}, commandId); 

Pour les commandes qui s'appliquent à la fenêtre active de l'éditeur, je a écrit une classe qui ajoute un intercepteur à la chaîne du gestionnaire de commandes de l'éditeur, et expose une interface simple qui accepte une entrée dans une commande enum. Cela peut être utilisé à la fois pour implémenter de nouvelles commandes et pour intercepter des commandes existantes. Vous pouvez le trouver à CommandTargetBase.cs, et vous pouvez voir l'exemple d'utilisation ici.