Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 命令栏控件赢得';我没有出现_Visual Studio 2008_Add In - Fatal编程技术网

Visual studio 2008 命令栏控件赢得';我没有出现

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

我们为VisualStudio2008开发了一个加载项,它在“项目”上下文菜单中安装一个命令栏项(右键单击解决方案资源管理器中的项目)。以下简化代码(在Connect.cs中)适用于除一台机器之外的所有机器:

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"];
}
资料来源: