Visual Studio 2010 Plug-in – Adding a context-menu to the Solution Explorer

It took me about 5 hours to do this.

There are 2 options, Visual studio Add-in (or shared Add-in) vs Visual studio package.

The package is far more complicated to give you far more control, but for a context menu on the solution explorer it is not needed.

So new project-> Other Project Types -> Extensibility -> Visual Studio Add-in.

Here’s a walk-through – Link

Also This one I followed some – Link

I recommend you leave on the option for add to tools menu until you have the context menu working, or to provide a place to put a settings dialog (if you don’t write a Tool-> options page.

Here’s the connection code:

  _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.
                //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);
            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.

This code checks to see if what the user has selected is a project for instance:

  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;

Note that certain string names in your code have to match up and I’m not sure which ones they are quite yet as I just did this yesterday.

Leave a Comment