Панель управления не будет отображаться - PullRequest
0 голосов
/ 16 января 2012

мы разработали AddIn для Visual Studio 2008, который устанавливает элемент командной строки в контекстном меню «Проект» (щелкните правой кнопкой мыши проект в обозревателе решений). Следующий упрощенный код (в 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 Development Edition SP1 английский). У нас есть другие машины с такой же конфигурацией ОС и VS, но кнопка там отображается правильно.

Любые намеки на эту тему приветствуются!

1 Ответ

1 голос
/ 11 декабря 2012

Поскольку в Visual Studio 2008 имеется более одной панели команд с именем Project, вам нужно найти правильную панель для вставки кнопки. К счастью, есть абсолютно простой, разумный и интуитивно понятный способ сделать это.

1. Нахождение уникального идентификатора командной строки

Откройте редактор реестра и перейдите к HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\9.0\General. Создайте новое значение DWORD с именем EnableVSIPLogging и установите значение 1.

Это позволяет вам определять уникальный GUID и ID команды панели команд, щелкая правой кнопкой мыши элемент управления, в который вы хотите вставить элемент управления, пока нажаты модификаторы SHIFT и CTRL. Это вызовет окно сообщения, подобное этому:

Visual Studio 2008 Debugging Message

Скопируйте содержимое сообщения, нажав CTRL + C, и вставьте его где-нибудь в текстовое поле. Запишите значения Guid и CmdID.

2. Извлечение командной строки по Guid и CmdID

Вы можете использовать следующий фрагмент кода для извлечения панели команд из значений, определенных выше:

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

Источник: http://blogs.msdn.com/b/dr._ex/archive/2007/04/17/using-ivsproffercommands-to-retrieve-a-visual-studio-commandbar.aspx

...