/// <summary>IDTExtensibility2 인터페이스의 OnConnection 메서드를 구현합니다. 추가 기능이 로드되고 있다는 알림 메시지를 받습니다.</summary> /// <param term='application'>호스트 응용 프로그램의 루트 개체입니다.</param> /// <param term='connectMode'>추가 기능이 로드되는 방법을 설명합니다.</param> /// <param term='addInInst'>이 추가 기능을 나타내는 개체입니다.</param> /// <seealso class='IDTExtensibility2' /> public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom) { AddNewSubCommand("OpenSolutionFolderExplorer", "Open Solution Folder with Explorer", 65); AddNewSubCommand("OpenSolutionFolderCmd", "Open Command Prompt on Solution Folder", 65); AddNewSubCommand("OpenCorrespondingFile", "Toggle Source/Header", 65); AddNewSubCommand("OpenFileInSolution", "Quick Open File In Solution", 65); AddNewSubCommand("About", "About ZAssist...", 65); //AddNewSubCommand("QuickFindFunction", "Quick Find Function", 65); _applicationObject = (DTE2)application; _addInInstance = (AddIn)addInInst; if (connectMode == ext_ConnectMode.ext_cm_UISetup || connectMode == ext_ConnectMode.ext_cm_Startup || connectMode == ext_ConnectMode.ext_cm_AfterStartup) { object[] contextGUIDS = new object[] { }; Commands2 commands = (Commands2)_applicationObject.Commands; string toolsMenuName; try { //명령을 다른 메뉴로 이동하려면 "Tools"를 // 영어 버전의 메뉴로 변경합니다. 이 코드는 culture를 메뉴 이름에 추가한 다음 // 해당 메뉴에 명령을 추가합니다. 모든 최상위 메뉴의 목록을 확인하려면 // CommandBar.resx 파일을 참조하십시오. ResourceManager resourceManager = new ResourceManager("ZAssist.CommandBar", Assembly.GetExecutingAssembly()); CultureInfo cultureInfo = new System.Globalization.CultureInfo(_applicationObject.LocaleID); string resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools"); toolsMenuName = resourceManager.GetString(resourceName); } catch { //지역화된 버전의 'Tools'를 찾으려고 시도했지만 찾지 못했습니다. // 기본값을 현재 culture에서 작동할 수 있는 en-US로 지정합니다. toolsMenuName = "Tools"; } //도구 메뉴에 명령을 배치합니다. //주 메뉴 항목이 모두 들어 있는 최상위 명령 모음인 MenuBar 명령 모음 찾기: Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"]; //MenuBar 명령 모음에서 도구 명령 모음 찾기: CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName]; CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl; //추가 기능에서 처리할 명령을 여러 개 추가하면 이 try/catch 블록이 중복될 수 있습니다. // 이 경우 QueryStatus/Exec 메서드도 업데이트하여 새 명령 이름을 포함하기만 하면 됩니다. try { //명령 컬렉션에 명령 추가: CommandBar toolsMenu = ((CommandBars)(_applicationObject.CommandBars))["Tools"]; try { /// 아래 문장에서 catch 로 빠진다는 건 ZAssist 가 메뉴에 없다는 말이다. CommandBarPopup k = (CommandBarPopup)(toolsMenu.Controls["ZAssist"]); k.Caption = k.Caption + ""; } catch (ArgumentException) { CommandBarPopup commandBarPopup = (CommandBarPopup)toolsMenu.Controls.Add(MsoControlType.msoControlPopup, System.Reflection.Missing.Value, System.Reflection.Missing.Value, 1, true); subMenu = commandBarPopup; subMenu.Visible = true; subMenu.Caption = "ZAssist"; int iMenuIndex = 1; foreach (NewCommandData newCommData in m_commands) { Command newCommand = null; try { newCommand = commands.Item(_addInInstance.ProgID + "." + newCommData.GetCommandName(), -1); } catch (Exception ex) { System.Diagnostics.Debug.Print("이미 존재하는지 검사하는 곳에서 exception 발생 : ", ex.Message); } if (null == newCommand) { newCommand = commands.AddNamedCommand(_addInInstance, newCommData.GetCommandName(), newCommData.GetShowName(), newCommData.GetShowName(), true, newCommData.GetInconIndex(), ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported + (int)vsCommandStatus.vsCommandStatusEnabled); } if (newCommand != null) { newCommand.AddControl(subMenu.CommandBar, iMenuIndex); } ++iMenuIndex; } } } catch (System.ArgumentException ex) { //이 경우, 같은 이름의 명령이 이미 있기 때문에 예외가 발생할 수 // 있습니다. 이 경우 명령을 다시 만들 필요가 없으며 예외를 무시해도 // 됩니다. System.Diagnostics.Debug.Print(ex.Message); } } }