Visual Studio 2010插件 – 向解决scheme资源pipe理器添加一个上下文菜单

我想在Visual Studio 2010的解决scheme资源pipe理器的上下文菜单中为特定文件types添加一个新选项。 因此,例如,右键单击* .cs文件将显示现有的上下文菜单加“我的新选项”。

我想知道代码会是什么样子。 并且会喜欢一个指向开发visual studio插件的好参考的指针。 我看到的教程/参考文献是显而易见的。

谢谢!

我花了大约5个小时来做​​到这一点。

有2个选项,Visual Studio加载项(或共享加载项)与Visual Studio包。

这个软件包要复杂得多,但是对于解决scheme资源pipe理器中的上下文菜单来说是不需要的。

所以新项目 – >其他项目types – >可扩展性 – > Visual Studio加载项。

这是一个步骤 – 链接

另外这一个我跟着一些 – 链接

我build议你留下添加到工具菜单的选项,直到你有上下文菜单工作,或提供一个地方放置一个设置对话框(如果你不写一个工具 – >选项页面。

这是连接代码:

_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. } } } 

这段代码检查用户是否select了一个项目,例如:

  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; } 

请注意,您的代码中的某些string名称必须匹配,我不确定哪些是他们相当还没有,因为我昨天做了这个。

我发现最好的方法是制作一个Visual Studio包而不是Visual Studio加载项。 VSix的部署经验如此华丽 – 整个事情是一个非常简单的体验。 它只支持Visual Studio 2010,但对我来说这已经足够好了。

这是结果vsct:

 <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> 

更新:

GAX / GAT for VS2010也可从http://msdn.microsoft.com/en-us/library/ff687173

原来的post

好吧,因为VS真的很复杂。 使用GAX / GAT是可能的,但是目前还没有VS2010版本 。 我build议从Visual Studio Gallery下载一些示例,试图理解整个事情是如何工作的,可悲的是,这不是一件容易的事情。

HTH

我发现自己不得不添加一个项目到代码编辑器窗口的上下文菜单中,最后是cmdBars["Script Context"]因为我特意要JavaScript文件。

作为一种find这个我觉得有用的共享的技术,我添加了新的菜单项到Visual Studio的所有(456)菜单控件中,使用下面的循环:

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

然后,我通过调整循环的边界,使用分而治之的技术缩小了这个范围:

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

直到我最终find我正在寻找的东西。

(相关的问题是在Visual Studio 2010插件 – 添加一个上下文菜单到编辑器窗口 )