퇴근5분전

# Visual Studio VSPackage 개발관련하여 정리한다.

- 기존 AddIns과 달리 생성방법이 매우 쉬웠다. ( 문서가 너무 어려워 ㅠㅠ... )

- 개발 샘플을 제공해주신 같이 일하는 과장님께 감솨...

 

1. VSIX 프로젝트를 생성한다.

2. 새 항목을 추가한다.

2-1. Visual Studio Package 를 생성해준다.

2-2. 생성 후에 다시 새 항목 추가를 이용하여 Custom Command를 추가한다.

- VSPackage 내에 CustomCommand.Initialize( this ); 가 자동으로 추가됨을 볼 수 있다.

3.  파일목록중   VsPackage.vsct 파일에서 추가된 커맨드가 어디에 뜰지를 결정하는 Parent ID 를 지정해준다.

왼쪽은 IDM_VS_MENU_TOOLS 로 기본 지정되어 있다. 이것은 메뉴중에 도구 > 해당 커맨드 메뉴가 뜨는 것이다.

우측엔 각 위치별로 ID를 찾아서 정리해 둔 것 이다. ( 제일 아래 참조!!! )

4. 해당 명령에 대한 기능을 MenuItemCallback 이벤트 핸들러에 구현하면 된다.

5. 아래는 해당 위치를 바꿔주었다. IDM_VS_CTXT_CODEWIN 으로 코드 편집창에서 메뉴를 띄워준다.

6. 아래는 Invoke CustomCommand 라는 메뉴가 뜬것을 볼 수 있다.

 

## Group ID 목록 ( Parent 는 1개를 지정해야 하므로 주석을 확인하며 필요한 ID를 복사해서 사용하면 됨 )

 - 정의된 내용을 자세히 보기 위해서는 .vsct 파일내에 정의된

  <!--This is the file that defines the IDs for all the commands exposed by VisualStudio. -->
  <Extern href="stdidcmd.h"/>

  <!--This header contains the command ids for the menus provided by the shell. -->
  <Extern href="vsshlids.h"/>

저 두 파일중 vsshlids.h 을 찾아서 보면 된다.  

C:\Program Files\Microsoft Visual Studio 14.0\VSSDK\VisualStudioIntegration\Common\Inc\

폴더내에 정의된 파일들이 있다.

 


       <Groups>
          <Group guid = "guidVSPackageCmdSet" id="MyMenuGroup" priority="0x0600">
              <Parent guid = "guidXamlUiCmds" id="IDM_XAML_EDITOR" />
              <!-- 코드편집창(.xaml)에서의 컨텍스트 메뉴, 아래 IDSymbol과 같이 써야 함. -->
              <!--<Parent guid = "guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN"/>-->
              <!-- 코드편집창(.cs)에서의 컨텍스트메뉴-->
              <!--<Parent guid = "guidSHLMainMenu" id="IDM_VS_CTXT_REFERENCE"/>-->
              <!--솔루션탐색기 : 참조파일-->
              <!--<Parent guid = "guidSHLMainMenu" id="IDM_VS_CTXT_ITEMNODE"/>-->
              <!--솔루션탐색기 : 파일-->
              <!--<Parent guid = "guidSHLMainMenu" id="IDM_VS_CTXT_PROJNODE"/> -->
              <!--솔루션탐색기 : 프로젝트 노드-->
              <!--<Parent guid = "guidSHLMainMenu" id="IDM_VS_MENU_PROJECT"/> -->
              <!--메뉴 : 프로젝트 > 아래-->
              <!--<Parent guid = "guidSHLMainMenu" id="IDM_VS_MENU_TOOLS"/>-->
              <!--메뉴 : 도구 > 아래..-->
          </Group>
      </Groups>  
      
    <GuidSymbol name = "guidXamlUiCmds" value="{4c87b692-1202-46aa-b64c-ef01faec53da}">
          <IDSymbol name = "IDM_XAML_EDITOR" value="0x103" />
    </GuidSymbol>

 

# 소스 편집에 필요한 간단한 소스

  Command에는 ServiceProvider 프로퍼티가 있음.

        private string GetSelection()
        {
            string setting = "";
            EnvDTE80.DTE2 _applicationObject = ServiceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2;
            //Check active document
            if (_applicationObject.ActiveDocument != null)
            {
                //Get active document
                EnvDTE.TextDocument objTextDocument = (EnvDTE.TextDocument)_applicationObject.ActiveDocument.Object("");
                EnvDTE.TextSelection objTextSelection = objTextDocument.Selection;

                if (!String.IsNullOrEmpty(objTextSelection.Text))
                {
                    //Get selected text
                    setting = objTextSelection.Text;
                }
            }
            return setting;
        }

        private void SetSelection(string txt)
        {
            EnvDTE80.DTE2 _applicationObject = ServiceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2;
            //Check active document
            if (_applicationObject.ActiveDocument != null)
            {
                //Get active document
                EnvDTE.TextDocument objTextDocument = (EnvDTE.TextDocument)_applicationObject.ActiveDocument.Object("");
                EnvDTE.TextSelection objTextSelection = objTextDocument.Selection;

                if (!String.IsNullOrEmpty(txt))
                {
                    objTextSelection.Insert(txt, (int)EnvDTE.vsInsertFlags.vsInsertFlagsContainNewText);
                    //  objTextDocument.Selection.Text = txt;
                }
            }
        }

    솔루션 탐색기에서 선택된 아이템!!

            EnvDTE80.DTE2 _applicationObject = ServiceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2;
            EnvDTE.Projects prjs = _applicationObject.ActiveSolutionProjects as EnvDTE.Projects;
            EnvDTE.UIHierarchy UIH = _applicationObject.ToolWindows.SolutionExplorer;
            Array SelectItems = (Array)UIH.SelectedItems;
            if (SelectItems != null)
            {
                foreach (EnvDTE.UIHierarchyItem item in SelectItems)
                {
                    EnvDTE.ProjectItem prj = item.Object as EnvDTE.ProjectItem;
                    string projectName = prj.ContainingProject.Name;
                    string projectPath = "" + prj.Properties.Item("FullPath").Value;
                }
            }