Plug-in Visual Studio 2010 – Ajout d’un menu contextuel à l’explorateur de solutions

Je souhaite append 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 le code ressemblerait; et aimerait un pointeur vers une bonne référence pour développer des plug-ins visuels de studio. Les tutoriels / références que je vois sont manifestement horribles.

Merci!

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

Il y a 2 options: Visual Studio Add-in (ou complément partagé) vs Visual Studio.

Le paquet est beaucoup plus compliqué pour vous donner beaucoup plus de contrôle, mais pour un menu contextuel sur l’explorateur de solution, il n’est pas nécessaire.

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

Voici une visite guidée – Lien

Aussi celui que j’ai suivi – Link

Je vous recommande de laisser l’option dans le menu Ajouter aux outils jusqu’à ce que le menu contextuel fonctionne ou de fournir un emplacement pour placer une boîte de dialog de parameters (si vous n’écrivez pas une page Options-> Outils).

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; ssortingng 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.ToSsortingng()); //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 suis pas sûr de savoir lesquels ils sont encore, car je viens de le faire hier.

J’ai trouvé que la meilleure façon de faire était de créer un package Visual Studio au lieu d’un complément Visual Studio. L’expérience du déploiement de vsix est tellement simple que l’ensemble a été une expérience très simple. Il ne supporte que Visual Studio 2010, mais cela me suffisait.

Voici le vsct résultant:

                               

METTRE À JOUR:

GAX / GAT pour VS2010 également disponible à l’ adresse http://msdn.microsoft.com/en-us/library/ff687173

POSTE ORIGINAL

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

HTH

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

Comme technique pour trouver ce que j’ai ressenti comme un partage utile, j’ai ajouté le nouvel élément de menu à tous les contrôles de menu (456) 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 cette technique en utilisant une technique de diviser et conquérir 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 j'ai finalement trouvé ce que je cherchais.

(La question associée à ce sujet se trouve dans le plug-in Visual Studio 2010 - Ajout d'un menu contextuel à la fenêtre de l'éditeur )