FAQ: VSPackage 확장으로 추가 기능 변환
추가 기능은 이제 사용되지 않습니다. 새 Visual Studio 확장을 만들려면 VSPackage를 만들어야 합니다. 추가 기능이 이미 있으면 계속 실행할 수 있습니다. 그러나 추가 기능을 배포하려면 VSPackage로 변환해야 합니다. 이 문서에서는 Visual Studio 추가 기능을 VSPackage 확장으로 변환하는 방법에 대한 몇 가지 질문과 대답을 소개합니다.
중요
대부분의 경우에는 VSPackage 프로젝트에 추가 기능 코드만 전송하면 됩니다.Initialize 메서드에서 GetService를 호출하여 DTE 자동화 개체를 가져올 수 있습니다.
DTE2 dte = (DTE2)GetService(typeof(DTE));
자세한 내용은 아래의 VSPackage에서 추가 기능 코드를 실행하려면 어떻게 하나요?를 참조하세요.
VSPackage 확장을 개발하려면 어떤 소프트웨어가 필요한가요?
Visual Studio 2013 Professional, Premium 또는 Ultimate Edition 외에 추가로 Visual Studio 2013 SDK를 설치해야 합니다. SDK는 Microsoft 다운로드 센터 웹 사이트의 Visual Studio 2013 SDK 페이지에서 다운로드할 수 있습니다. Visual Studio 2013 업데이트 2를 설치하기 전에 SDK를 설치하는 것이 좋습니다.
VSPackage 설명서는 어디에 있나요?
먼저 Visual Studio 개요를 확장합니다.를 확인하세요. VSPackage 개발에 대한 기타 문서는 해당 문서 아래에 정렬되어 있습니다.
추가 기능 프로젝트를 VSPackage 프로젝트로 변환할 수 있나요?
VSPackage 프로젝트에 사용되는 메커니즘은 추가 기능 프로젝트의 메커니즘과 다르기 때문에 추가 기능 프로젝트를 VSPackage 프로젝트로 변환할 수 없습니다. VSPackage 프로젝트 템플릿에는 많은 코드가 포함되어 있어 해당 템플릿을 비교적 쉽게 시작하고 VSPackage 확장으로 실행할 수 있습니다.
VSPackage 확장 개발은 어떻게 시작하나요?
VSPackage 확장용 프로젝트 템플릿에 필요한 요소가 포함되어 있습니다. 메뉴 명령이 포함된 VSPackage를 만드는 방법은 다음과 같습니다.
메뉴 명령이 포함된 VSPackage를 만들려면
Visual Studio 패키지 프로젝트를 만들어 이름을 TestVSPackage로 지정합니다. (이렇게 하려면 파일, 새로 만들기, 프로젝트를 차례로 선택하거나 빠른 실행 창에 프로젝트를 입력합니다. 새 프로젝트 대화 상자에서 기타 프로젝트 형식, 확장성을 차례로 확장한 다음 Visual Studio 패키지를 선택합니다. 프로젝트 이름을 TestVSPackage로 지정하고 프로젝트 위치를 지정합니다.
Visual Studio 패키지 마법사가 나타납니다. 마법사의 프로그래밍 언어 선택 페이지에서 언어로 C#을 선택합니다. 새 키 생성 옵션은 선택한 상태로 둡니다. VSPackage 옵션 페이지에서 메뉴 명령을 선택합니다. 마침 단추를 선택합니다.
F5 키를 눌러 디버그 모드에서 프로젝트를 빌드하고 실행합니다.
두 번째 Visual Studio 인스턴스가 표시됩니다. 이 두 번째 인스턴스는 실험적 인스턴스이며, 코드를 작성하는 데 사용하는 Visual Studio 인스턴스와 설정이 다를 수도 있습니다. 실험적 인스턴스를 처음 실행할 때는 VS Online에 로그인하고 테마와 프로필을 지정하라는 메시지가 표시됩니다.
실험적 인스턴스의 도구 메뉴에는 내 명령 이름이라는 단추가 표시됩니다. 이 단추를 선택하면 TestVSPackagePackage.MenuItemCallback() 내부라는 메시지가 표시됩니다.
VSPackage에서 추가 기능 코드를 실행하려면 어떻게 하나요?
추가 기능 코드는 보통 두 가지 방법 중 하나로 실행됩니다.
메뉴 명령을 통한 트리거. 코드는 IDTCommandTarget.Exec 메서드에 포함되어 있습니다.
시작 시 자동으로 실행. 코드는 OnConnection 이벤트 처리기에 포함되어 있습니다.
VSPackage에서도 같은 방식을 사용할 수 있습니다. 콜백 메서드에 일부 추가 기능 코드를 추가하는 방법은 다음과 같습니다.
VSPackage에서 메뉴 명령을 구현하려면
메뉴 명령이 포함된 VSPackage를 만듭니다. VSPackage 확장 개발은 어떻게 시작하나요?를 참조하세요.
VSPackage 정의가 포함된 파일을 엽니다. C# 프로젝트에서 이 파일은 <프로젝트 이름>Package.cs입니다.
파일에 다음 using 문을 추가합니다.
using EnvDTE; using EnvDTE80;
MenuItemCallback 메서드를 찾습니다. GetService 호출을 추가하여 DTE2 개체를 가져옵니다.
DTE2 dte = (DTE2)GetService(typeof(DTE));
추가 기능의 IDTCommandTarget.Exec 메서드에 포함되어 있었던 코드를 추가합니다. 예를 들어 아래에는 출력 창에 새 창을 추가하고 "Some Text"를 해당 새 창에 인쇄하는 일부 코드가 나와 있습니다.
private void MenuItemCallback(object sender, EventArgs e) { DTE2 dte = (DTE2) GetService(typeof(DTE)); OutputWindow outputWindow = dte.ToolWindows.OutputWindow; OutputWindowPane outputWindowPane = outputWindow.OutputWindowPanes.Add("A New Pane"); outputWindowPane.OutputString("Some Text"); }
이 프로젝트를 빌드하고 실행합니다. F5 키를 누르거나 디버그 도구 모음에서 시작을 선택합니다. Visual Studio의 실험적 인스턴스에서 도구 메뉴에는 내 명령 이름이라는 단추가 있습니다. 이 단추를 선택하면 Some Text라는 단어가 출력 창에 표시됩니다. 이때 출력 창을 열어야 할 수 있습니다.
시작 시 코드가 실행되도록 할 수도 있습니다. 그러나 일반적으로 VSPackage 확장에는 이 방식을 사용하지 않는 것이 좋습니다. Visual Studio 시작 시 너무 많은 확장이 로드되면 시작 시간이 현저하게 길어질 수 있습니다. 따라서 솔루션을 열 때와 같이 일부 조건이 충족되는 경우에만 VSPackage를 자동으로 로드하는 것이 보다 효율적입니다.
아래 절차에서는 솔루션을 열 때 자동으로 로드되는 VSPackage의 추가 기능 코드를 실행하는 방법을 보여줍니다.
VSPackage를 자동 로드하려면
Visual Studio 패키지 프로젝트를 만듭니다. 이 작업을 수행하는 단계는 VSPackage 확장 개발은 어떻게 시작하나요?를 참조하세요. 프로젝트 이름을 TestAutoload로 지정하고 프로젝트 위치를 지정합니다.
Visual Studio 패키지 마법사가 나타납니다. 마법사의 프로그래밍 언어 선택 페이지에서 언어로 C#을 선택하고 새 키 생성 옵션은 선택한 상태로 둡니다. 마침을 선택합니다.
TestAutoloadPackage.cs를 엽니다. 패키지 클래스가 선언된 줄을 찾습니다.
public sealed class <name of your package>Package : Package
이 줄 위에는 특성 집합이 있습니다. 다음 특성을 추가합니다.
[ProvideAutoLoad(UIContextGuids80.SolutionExists)]
그런 다음 Initialize() 메서드에서 중단점을 설정하고 F5 키를 눌러 디버깅을 시작합니다.
실험적 인스턴스에서 프로젝트를 엽니다. VSPackage가 로드되고 중단점에 도달합니다.
UIContextGuids80의 필드를 사용하여 VSPackage를 로드할 다른 컨텍스트를 지정할 수 있습니다. 자세한 내용은 방법: 자동 있는 VSPackage 로드을 참조하세요.
DTE 개체는 어떻게 가져오나요?
추가 기능에 메뉴 명령, 도구 모음 단추, 도구 창 등의 UI가 표시되지 않는 경우 VSPackage에서 DTE 자동화 개체를 가져오면 코드를 그대로 사용할 수 있습니다. 방법은 다음과 같습니다.
VSPackage에서 DTE 개체를 가져오려면
VSPackage 솔루션에서 <프로젝트 이름>Package.cs 파일을 찾습니다. 이 파일은 Package에서 파생되는 클래스로, Visual Studio와 상호 작용하는 데 사용할 수 있습니다. 여기서는 해당 GetService를 사용하여 DTE2 개체를 가져옵니다.
다음 using 문을 추가합니다.
using EnvDTE; using EnvDTE80;
Initialize 메서드를 찾습니다. 이 메서드는 패키지 마법사에서 지정한 명령을 처리합니다. GetService 호출을 추가하여 DTE 개체를 가져옵니다.
DTE dte = (DTE)GetService(typeof(DTE));
DTE 자동화 개체를 가져온 후에는 추가 기능 코드의 나머지 부분을 프로젝트에 추가할 수 있습니다. DTE2 개체가 필요한 경우에도 같은 작업을 수행하면 됩니다.
추가 기능의 메뉴 명령 및 도구 모음 단추를 VSPackage 스타일로 변경하려면 어떻게 하나요?
VSPackage 확장은 .vsct 파일을 사용하여 대부분의 메뉴 명령, 도구 모음, 도구 모음 단추 및 기타 UI를 만듭니다. VSPackage 프로젝트 템플릿은 도구 메뉴에 명령을 만드는 옵션을 제공합니다. 자세한 내용은 Visual Studio 패키지 템플릿을 사용 하 여 연습: 메뉴 명령 만들기을 참조하세요.
.vsct 파일에 대한 자세한 내용은 Vspackages에 IDE 사용자 인터페이스 요소를 추가 하는 방법을 참조하세요. .vsct 파일을 사용하여 메뉴 항목, 도구 모음 및 도구 모음 단추를 추가하는 방법을 보여 주는 연습은 명령, 메뉴 및 도구 모음에 대 한 연습을 참조하세요.
VSPackage 방식으로 사용자 지정 도구 창을 추가하려면 어떻게 하나요?
VSPackage 프로젝트 템플릿은 도구 창을 만드는 옵션을 제공합니다. 자세한 내용은 도구 창 및 그 아래의 문서(특히 방법: 도구 창 만들기)를 참조하세요.
VSPackage 방식으로 Visual Studio 창을 관리하려면 어떻게 하나요?
추가 기능이 Visual Studio 창을 관리하는 경우 VSPackage에서도 추가 기능 코드가 작동합니다. 예를 들어 아래 절차에서는 작업 목록을 관리하는 코드를 VSPackage의 MenuItemCallback 메서드에 추가하는 방법을 보여줍니다.
창 관리 코드를 추가 기능에서 VSPackage로 삽입하려면
VSPackage 확장 개발은 어떻게 시작하나요? 섹션의 설명에 따라 메뉴 명령이 포함된 VSPackage를 만듭니다.
VSPackage 정의가 포함된 파일을 엽니다. C# 프로젝트에서 이 파일은 <프로젝트 이름>Package.cs입니다.
다음 using 문을 추가합니다.
using EnvDTE; using EnvDTE80;
MenuItemCallback 메서드를 찾습니다. GetService 호출을 추가하여 DTE2 개체를 가져옵니다.
DTE2 dte = (DTE2)GetService(typeof(DTE));
추가 기능의 코드를 추가합니다. 예를 들어 새 작업을 작업 목록에 추가하고 작업 수를 표시한 다음 작업 하나를 삭제하는 코드는 다음과 같습니다.
private void MenuItemCallback(object sender, EventArgs e) { DTE2 dte = (DTE2) GetService(typeof(DTE)); TaskList tl = (TaskList)dte.ToolWindows.TaskList; askItem tlItem; // Add a couple of tasks to the Task List. tlItem = tl.TaskItems.Add(" ", " ", "Test task 1.", vsTaskPriority.vsTaskPriorityHigh, vsTaskIcon.vsTaskIconUser, true, "", 10, true, true); tlItem = tl.TaskItems.Add(" ", " ", "Test task 2.", vsTaskPriority.vsTaskPriorityLow, vsTaskIcon.vsTaskIconComment, true, "", 20, true,true); // List the total number of task list items after adding the new task items. System.Windows.Forms.MessageBox.Show("Task Item 1 description: "+tl.TaskItems.Item(2).Description); System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); // Remove the second task item. The items list in reverse numeric order. System.Windows.Forms.MessageBox.Show("Deleting the second task item"); tl.TaskItems.Item(2).Delete(); System.Windows.Forms.MessageBox.Show("Total number of task items: "+tl.TaskItems.Count); }
VSPackage에서 프로젝트와 솔루션을 관리하려면 어떻게 하나요?
추가 기능이 프로젝트와 솔루션을 관리하는 경우 VSPackage에서도 추가 기능 코드가 작동합니다. 예를 들어 다음 절차에서는 시작 프로젝트를 가져오는 코드를 추가하는 방법을 보여줍니다.
VSPackage 확장 개발은 어떻게 시작하나요? 섹션의 설명에 따라 메뉴 명령이 포함된 VSPackage를 만듭니다.
VSPackage 정의가 포함된 파일을 엽니다. C# 프로젝트에서 이 파일은 <프로젝트 이름>Package.cs입니다.
다음 using 문을 추가합니다.
using EnvDTE; using EnvDTE80;
MenuItemCallback 메서드를 찾습니다. GetService 호출을 추가하여 DTE2 개체를 가져옵니다.
DTE2 dte = (DTE2)GetService(typeof(DTE));
추가 기능의 코드를 추가합니다. 예를 들어 다음 코드는 솔루션의 시작 프로젝트 이름을 가져옵니다. 이 패키지를 실행할 때는 다중 프로젝트 솔루션이 열려 있어야 합니다.
private void MenuItemCallback(object sender, EventArgs e) { DTE2 dte = (DTE2) GetService(typeof(DTE)); SolutionBuild2 sb = (SolutionBuild2)dte.Solution.SolutionBuild; Project startupProj; string msg = ""; foreach (String item in (Array)sb.StartupProjects) { msg += item; } System.Windows.Forms.MessageBox.Show("Solution startup Project: "+msg); startupProj = dte.Solution.Item(msg); System.Windows.Forms.MessageBox.Show("Full name of solution's startup project: "+"/n"+startupProj.FullName); }
VSPackage에서 바로 가기 키를 설정하려면 어떻게 하나요?
.vsct 파일의 <KeyBindings> 요소를 사용합니다. 다음 예에서 idCommand1 명령의 바로 가기 키는 Alt+A이고 idCommand2 명령의 바로 가기 키는 Alt+Ctrl+A입니다. 키 이름의 구문을 확인하세요.
<KeyBindings>
<KeyBinding guid="MyProjectCmdSet" id="idCommand1" editor="guidVSStd97" key1="A" mod1="ALT" />
<KeyBinding guid="MyProjectCmdSet" id="idCommand2" editor="guidVSStd97" key1="A" mod1="CONTROL" mod2="ALT" />
</KeyBindings>
VSPackage에서 자동화 이벤트를 처리하려면 어떻게 하나요?
VSPackage에서도 추가 기능에서와 같은 방식으로 자동화 이벤트를 처리합니다. 다음 코드에서는 OnItemRenamed 이벤트를 처리하는 방법을 보여줍니다. 이 예에서는 DTE 개체를 이미 가져왔다고 가정합니다.
Events2 dteEvents = (Events2)dte.Events;
dteEvents.ProjectItemsEvents.ItemRenamed += listener1.OnItemRenamed;
. . .
public void OnItemRenamed(EnvDTE.ProjectItem projItem, string oldName)
{
string s = "[Event] Renamed " + oldName + " to " + Path.GetFileName(projItem.get_FileNames(1) + " in project " + projItem.ContainingProject.Name;
}