Visual studio 2008 命令栏控件赢得';我没有出现
我们为VisualStudio2008开发了一个加载项,它在“项目”上下文菜单中安装一个命令栏项(右键单击解决方案资源管理器中的项目)。以下简化代码(在Connect.cs中)适用于除一台机器之外的所有机器:Visual studio 2008 命令栏控件赢得';我没有出现,visual-studio-2008,add-in,Visual Studio 2008,Add In,我们为VisualStudio2008开发了一个加载项,它在“项目”上下文菜单中安装一个命令栏项(右键单击解决方案资源管理器中的项目)。以下简化代码(在Connect.cs中)适用于除一台机器之外的所有机器: object[] contextGUIDS = new object[] { }; string commandName = "My_Command"; string tooltip = "My tooltip"; Command projectCommand = applicatio
object[] contextGUIDS = new object[] { };
string commandName = "My_Command";
string tooltip = "My tooltip";
Command projectCommand = applicationObject.Commands.AddNamedCommand(addInInstance, commandName, commandName, tooltip, false, 1, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled);
CommandBars commandBars = (CommandBars)(fApplicationObject.CommandBars);
CommandBar projectCommandBar = commandBars["Project"];
CommandBarControl projectButton = (CommandBarControl)(projectCommand.AddControl(projectCommandBar, projectCommandBar.Controls.Count + 1));
projectButton.Caption = "My caption";
projectButton.TooltipText = tooltip;
在一台机器上,代码将毫无例外地运行,但按钮不会显示。再次调用安装代码将引发异常,因为已有命令栏项。但是,应位于“工具”菜单中的另一项已正确安装并显示
即使操作系统和Visual Studio已经重新安装,问题仍然存在(Windows 7 x86 SP1德语版,Visual Studio开发版SP1英语版)。我们有其他具有相同OS和VS配置的机器,但是按钮正确地显示在那里
欢迎对此主题提供任何提示 由于Visual Studio 2008中有多个名为
Project
的命令栏,因此需要找到正确的命令栏来插入按钮。幸运的是,有一种绝对简单、合理和直观的方法可以做到这一点
1。查找命令栏的唯一ID
打开注册表编辑器并导航到HKEY\U CURRENT\U USER\Software\Microsoft\VisualStudio\9.0\General
。创建名为enablevsiploging
的新DWORD值,并将该值设置为1
这使您可以通过在按住SHIFT和CTRL修改器的同时右键单击要插入控件的控件来确定命令栏的唯一GUID和命令ID。这样会出现如下消息框:
按CTRL+C复制消息内容,并将其粘贴到文本框的某个位置。记下Guid
和CmdID
值
2。按Guid和CMID获取命令栏
您可以使用以下代码段从上面确定的值获取命令栏:
private CommandBar FindCommandBar(Guid guidCmdGroup, uint menuID)
{
IOleServiceProvider sp = (IOleServiceProvider)fApplicationObject;
Guid guidSvc = typeof(IVsProfferCommands).GUID;
Object objService;
sp.QueryService(ref guidSvc, ref guidSvc, out objService);
IVsProfferCommands vsProfferCmds = (IVsProfferCommands)objService;
return vsProfferCmds.FindCommandBar(IntPtr.Zero, ref guidCmdGroup, menuID) as CommandBar;
}
[ComImport, Guid("6D5140C1-7436-11CE-8034-00AA006009FA"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IOleServiceProvider
{
[PreserveSig]
int QueryService([In]ref Guid guidService, [In]ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out System.Object obj);
}
在调用FindCommandBar
方法之前,请确保命令栏已正确初始化,否则调用将失败,出现ComException
(HResult E_fail)。执行此操作的简单方法:
private void EnsureInitialized()
{
var menuBar = ((CommandBars)fApplicationObject.CommandBars)["MenuBar"];
}
资料来源: