web-dev-qa-db-fra.com

Plug-in Visual Studio 2010 - Ajout d'un menu contextuel à l'Explorateur de solutions

Je souhaite ajouter une nouvelle option dans le menu contextuel de l'Explorateur de solutions de Visual Studio 2010 pour un type de fichier spécifique. Ainsi, par exemple, un clic droit sur un fichier * .cs affichera le menu contextuel existant plus "ma nouvelle option".

Je me demande à quoi ressemblerait le code; et j'aimerais un pointeur vers une bonne référence pour développer des plug-ins Visual Studio. Les tutoriels/références que je vois sont visiblement horribles.

Merci!

46
Kenn

Cela m'a pris environ 5 heures pour le faire.

Il existe 2 options, le complément Visual studio (ou le complément partagé) vs le package Visual studio.

Le package est beaucoup plus compliqué pour vous donner beaucoup plus de contrôle, mais pour un menu contextuel sur l'Explorateur de solutions, il n'est pas nécessaire.

Donc nouveau projet-> Autres types de projets -> Extensibilité -> Complément Visual Studio.

Voici une présentation - Lien

Aussi celui-ci, j'ai suivi certains - Lien

Je vous recommande de laisser l'option pour ajouter au menu d'outils jusqu'à ce que le menu contextuel fonctionne, ou pour fournir un endroit pour mettre une boîte de dialogue de paramètres (si vous n'écrivez pas une page Outils-> options.

Voici le code de connexion:

  _applicationObject = (DTE2)application;
        _addInInstance = (AddIn)addInInst;
        if (connectMode == ext_ConnectMode.ext_cm_UISetup)
        {
            object[] contextGUIDS = new object[] { };
            Commands2 commands = (Commands2)_applicationObject.Commands;
            string toolsMenuName = "Tools";

            //Place the command on the tools menu.
            //Find the MenuBar command bar, which is the top-level command bar holding all the main menu items:
            Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];

            //Find the Tools command bar on the MenuBar command bar:
            CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
            CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
            // get popUp command bars where commands will be registered.
            CommandBars cmdBars = (CommandBars)(_applicationObject.CommandBars);
            CommandBar vsBarItem = cmdBars["Item"]; //the pop up for clicking a project Item
            CommandBar vsBarWebItem = cmdBars["Web Item"];
            CommandBar vsBarMultiItem = cmdBars["Cross Project Multi Item"];
            CommandBar vsBarFolder = cmdBars["Folder"];
            CommandBar vsBarWebFolder = cmdBars["Web Folder"];
            CommandBar vsBarProject = cmdBars["Project"]; //the popUpMenu for right clicking a project
            CommandBar vsBarProjectNode = cmdBars["Project Node"];

            //This try/catch block can be duplicated if you wish to add multiple commands to be handled by your Add-in,
            //  just make sure you also update the QueryStatus/Exec method to include the new command names.
            try
            {
                //Add a command to the Commands collection:
                Command command = commands.AddNamedCommand2(_addInInstance, "HintPaths", "HintPaths", "Executes the command for HintPaths", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);

                //Add a control for the command to the tools menu:
                if ((command != null) && (toolsPopup != null))
                {
                    //command.AddControl(toolsPopup.CommandBar, 1);
                    command.AddControl(vsBarProject); 
                }
            }
            catch (System.ArgumentException argEx)
            {
                System.Diagnostics.Debug.Write("Exception in HintPaths:" + argEx.ToString());
                //If we are here, then the exception is probably because a command with that name
                //  already exists. If so there is no need to recreate the command and we can 
                //  safely ignore the exception.
            }
        }
    }

Ce code vérifie si ce que l'utilisateur a sélectionné est un projet par exemple:

  private Project GetProject()
    {
        if (_applicationObject.Solution == null || _applicationObject.Solution.Projects == null || _applicationObject.Solution.Projects.Count < 1)
            return null;
        if (_applicationObject.SelectedItems.Count == 1 && _applicationObject.SelectedItems.Item(1).Project != null)
            return _applicationObject.SelectedItems.Item(1).Project;
        return null;
    }

Notez que certains noms de chaîne dans votre code doivent correspondre et je ne sais pas trop lesquels ils sont, comme je viens de le faire hier.

32
Maslow

J'ai trouvé que la meilleure façon de procéder était de créer un package Visual Studio au lieu d'un complément Visual Studio. L'expérience de déploiement vsix est tellement simple - le tout a été une expérience vraiment facile. Il ne prend en charge que Visual Studio 2010, mais c'était assez bien dans mon cas.

Voici le vsct résultant:

<Commands package="guidBingfooPluginPkg">
    <Groups>
      <Group guid="guidBingfooPluginCmdSet" id="MyMenuGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>
      </Group>
    </Groups>

    <Buttons>
      <Button guid="guidBingfooPluginCmdSet" id="cmdidfooLocalBox" priority="0x0100" type="Button">
        <Parent guid="guidBingfooPluginCmdSet" id="MyMenuGroup" />
        <!-- <Icon guid="guidImages" id="bmpPic1" /> -->
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <CommandName>cmdidfooLocalBox</CommandName>
          <ButtonText>View in foo</ButtonText>
        </Strings>
      </Button>

      <Button guid="guidBingfooPluginCmdSet" id="cmdidfooTestBed" priority="0x0100" type="Button">
        <Parent guid="guidBingfooPluginCmdSet" id="MyMenuGroup" />
        <CommandFlag>DynamicVisibility</CommandFlag>
        <Strings>
          <CommandName>cmdidfooTestBed</CommandName>
          <ButtonText>View in foo on Test Beds</ButtonText>
        </Strings>
      </Button>

    </Buttons>

    <Bitmaps>
      <Bitmap guid="guidImages" href="Resources\Images_32bit.bmp" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
    </Bitmaps>
  </Commands>

  <Symbols>
    <GuidSymbol name="guidBingfooPluginPkg" value="{62c4a13c-cc61-44a0-9e47-33111bd323ce}" />

    <GuidSymbol name="guidBingfooPluginCmdSet" value="{59166210-d88c-4259-9809-418bc332b0ab}">
      <IDSymbol name="MyMenuGroup" value="0x1020" />
      <IDSymbol name="cmdidfooLocalBox" value="0x0100" />
      <IDSymbol name="cmdidfooTestBed" value="0x0101" />
    </GuidSymbol>

    <GuidSymbol name="guidImages" value="{2dff8307-a49a-4951-a236-82e047385960}" >
      <IDSymbol name="bmpPic1" value="1" />
      <IDSymbol name="bmpPic2" value="2" />
      <IDSymbol name="bmpPicSearch" value="3" />
      <IDSymbol name="bmpPicX" value="4" />
      <IDSymbol name="bmpPicArrows" value="5" />
    </GuidSymbol>
  </Symbols>
</CommandTable>
16
Kenn

MISE À JOUR:

GAX/GAT pour VS2010 également disponible sur http://msdn.Microsoft.com/en-us/library/ff68717

POST ORIGINAL

Eh bien, c'est horrible parce que VS est vraiment complexe. L'utilisation de GAX/GAT était possible, mais il y a pas encore de version VS201 . Ce que je suggère, c'est de télécharger des exemples à partir de Visual Studio Gallery pour essayer de comprendre comment tout cela fonctionne, malheureusement pas une tâche facile.

HTH

3
Marcote

Je me suis retrouvé à ajouter un élément au menu contextuel de la fenêtre de l'éditeur de code, qui a fini par être cmdBars["Script Context"] comme je le souhaitais spécifiquement pour les fichiers JavaScript.

Pour trouver ce que je pensais utile de partager, j'ai ajouté le nouvel élément de menu à tous les (456) contrôles de menu dans Visual Studio avec la boucle suivante:

foreach (CommandBar cc in cmdBars)
{
    if (cc.Index >= 1 && cc.Index <= 456)
    {
        command.AddControl(cmdBars[cc.NameLocal]);
    }
}

J'ai ensuite réduit cela en utilisant une technique de division et de conquête en ajustant les limites de la boucle:

    if (cc.Index >= 1 && cc.Index <= 256)
    ...
    if (cc.Index >= 1 && cc.Index <= 128)
    ...
    if (cc.Index >= 64 && cc.Index <= 128)
    ...etc...

Jusqu'à ce que je trouve finalement ce que je cherchais.

(La question connexe est à Plug-in Visual Studio 2010 - Ajout d'un menu contextuel à la fenêtre de l'éditeur )

2
James Wiseman