VsPackage ] 개발 방법!
# 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;
}
}
'# 4) .Net ( Vs 2010 ) > C#' 카테고리의 다른 글
컨트롤 Zoom In Out 기능 기초. (0) | 2018.03.06 |
---|---|
Prezi 흉내내기... (0) | 2017.07.13 |
하루 중 근무시간 9 - 6 와 시간외 근무시간 구하기. (0) | 2016.11.09 |
Epplus 관련정보를 정리해본다. (0) | 2016.11.09 |
친구에게 만들어준 프로그램! 작업자 이력관리. (0) | 2016.11.08 |