다음을 통해 공유


첫 번째 Visual Studio 확장

이 문서에서는 첫 번째 Visual Studio 확장을 시작하고 실행하기 위한 몇 가지 간단한 단계를 안내합니다. Visual Studio 확장은 .NET Framework 및 C#을 사용하여 작성됩니다. 이미 .NET 개발자인 경우 확장 작성이 대부분의 다른 .NET 프로그램 및 라이브러리 작성과 비슷하다는 것을 알 수 있습니다.

오늘 작성할 확장은 실행 시 텍스트 편집기에 새 GUID를 삽입하는 명령을 추가합니다. 간단하고 유용하며 확장 개발의 다양한 측면에 대한 좋은 소개를 제공합니다.

시각적 학습자인 경우 자습서를 따르는 사람의 이 짧은 비디오를 확인하세요.

첫 번째 Visual Studio 확장 작성을 시작하기 전에(쉽습니다. 약속합니다!) 필요한 도구가 있는지 확인합니다.

프로젝트 만들기

선택할 수 있는 여러 가지 프로젝트 템플릿이 있으므로 올바른 선택을 하려고 합니다. 이 커뮤니티 도구 키트에 사용되는 템플릿은 모두 이름에 모니커 (Community)가 있습니다.

VSIX Project w/Command (Community) 템플릿에는 연결된 명령이 함께 제공되므로 여기에서 쉽게 시작할 수 있습니다. 대부분의 확장에 적합한 시작점입니다. 도구 창을 원하는 경우 VSIX Project w/Tool Window (Community) 템플릿을 사용합니다. 도구 창을 여는 명령도 있습니다.

MEF 전용 확장 또는 기타 고급 시나리오에 대해 Empty VSIX Project (Community) 또는 VSIX Project (Community) 템플릿을 사용합니다.

이번에는 아래 스크린샷과 같이 VSIX Project w/Command (Community) 템플릿을 선택합니다.

New Project Dialog showing VSIX project templates.

프로젝트 템플릿을 선택한 후 프로젝트 이름을 지정해야 합니다. 이름을 InsertGuid로 지정합니다.

Configure your new project.

만들기 단추를 누른 후 기본 VSIX 프로젝트는 다음과 같이 표시됩니다.

New project files and folders.

중요한 파일들

가장 중요한 파일을 살펴보겠습니다.

InsertGuidPackage.cs는 Package 클래스입니다. 해당 InitializeAsync(...) 메서드는 Visual Studio에서 확장을 초기화하기 위해 호출됩니다. 여기에서 이벤트 수신기를 추가하고 명령, 도구 창, 설정 및 기타 항목을 등록합니다.

source.extension.vsixmanifest는 확장에 대한 매니페스트 파일입니다. 여기에는 제목 및 설명과 같은 메타데이터뿐만 아니라 확장에 포함된 항목에 대한 정보도 포함됩니다.

VSCommandTable.vsct는 명령 및 키 바인딩이 선언적으로 정의되어 Visual Studio에 등록할 수 있는 XML 파일입니다.

Commands/MyCommand.csVSCommandTable.vsct 파일에 정의된 명령의 명령 처리기입니다. 단추를 클릭하여 명령이 실행될 때 발생하는 동작을 제어합니다.

명령 수정

먼저 명령에 Visual Studio 메뉴 시스템 내의 올바른 이름, 아이콘 및 위치가 있는지 확인하려고 합니다.

VSCommandTable.vsct 파일을 열고 <Group><Button>을 찾습니다. 어떻게 단추가 그룹을 부모로 지정하고 그룹의 부모가 기본 제공 VSMainMenu/Tools 메뉴인지 확인합니다.

확장의 경우 Insert GUID 명령 단추를 Edit 주 메뉴 아래 배치하려고 하므로 그룹의 부모를 편집 메뉴로 다시 설정합니다. 다음 코드 조각과 같이 ToolsEdit으로 바꿉니다.

<Group guid="InsertGuid" id="MyMenuGroup" priority="0x0600">
  <Parent guid="VSMainMenu" id="Edit"/>
</Group>

올바른 스폿을 쉽게 찾을 수 있도록 배치에 대한 전체 IntelliSense를 얻을 수 있습니다.

VSCT parent IntelliSense.

<Button>에는 업데이트도 필요합니다. <Icon> 요소의 id 특성을 PasteAppend로 업데이트하여 새 아이콘을 제공합니다. 좋은 설명이 포함된 이름으로 <ButtonText> 텍스트를 업데이트하고 명령의 기술 이름으로 <LocCanonicalName>을 업데이트합니다. 이 이름은 도구 > 옵션 > 환경 > 키보드 대화 상자에서 사용자 지정 바로 가기 키를 명령에 할당할 때 사용자에게 표시되는 이름입니다.

<Button guid="InsertGuid" id="MyCommand" priority="0x0100" type="Button">
  <Parent guid="InsertGuid" id="MyMenuGroup" />
  <Icon guid="ImageCatalogGuid" id="PasteAppend" />
  <CommandFlag>IconIsMoniker</CommandFlag>
  <Strings>
    <ButtonText>Insert GUID</ButtonText>
    <LocCanonicalName>.Edit.InsertGuid</LocCanonicalName>
  </Strings>
</Button>

참고 항목

<LocCanonicalName>는 항상 점 문자로 시작합니다. 그러면 다른 텍스트가 자동으로 앞에 추가되지 않으며 점이 표시되지 않습니다.

Visual Studio의 이미지 라이브러리 내에서 사용할 수 있는 수천 개의 아이콘을 사용하고 IntelliSense에 표시된 미리 보기를 가져올 수도 있습니다.

VSCT icon IntelliSense.

명령의 이름, 아이콘 및 위치를 업데이트했으며, 이제 텍스트 편집기에 GUID를 삽입하는 일부 코드를 작성하겠습니다.

/Commands/MyCommand.cs 파일을 열고 실행 시 새 GUID를 삽입하도록 수정합니다.

using System;
using Community.VisualStudio.Toolkit;
using EnvDTE;
using Microsoft.VisualStudio.Shell;
using Task = System.Threading.Tasks.Task;

namespace InsertGuid
{
    [Command(PackageIds.MyCommand)]
    internal sealed class MyCommand : BaseCommand<MyCommand>
    {
        protected override async Task ExecuteAsync(OleMenuCmdEventArgs e)
        {
            await Package.JoinableTaskFactory.SwitchToMainThreadAsync();
            DocumentView docView = await VS.Documents.GetActiveDocumentViewAsync();
            if (docView?.TextView == null) return;
            SnapshotPoint position = docView.TextView.Caret.Position.BufferPosition;
            docView.TextBuffer?.Insert(position, Guid.NewGuid().ToString()); 
        }
    }
}

VS 개체를 사용하여 활성 편집기 텍스트 뷰를 가져온 다음, 텍스트 버퍼의 캐럿 위치에 GUID를 삽입합니다.

참고 항목

이 커뮤니티 도구 키트의 여러 위치에 await JoinableTaskFactory.SwitchToMainThreadAsync()ThreadHelper.ThrowIfNotOnUIThread()가 표시됩니다. 이 항목은 스레드 전환 모범 사례를 처리하므로 이 시점에는 언제 어떻게 사용해야 하는지 알 필요가 없습니다. 코드 수정(전구)을 포함하는 컴파일러 경고가 있어서 매우 쉽습니다.

이제 확장의 첫 번째 초안이 완료되었으며 테스트하겠습니다.

실행 및 디버깅

확장을 실행하는 것은 다른 .NET 프로젝트를 실행하는 것만큼 쉽습니다. F5 키를 눌러 디버거를 연결하여 실행하거나 Ctrl+F5를 눌러 연결하지 않고 실행하면 됩니다.

이렇게 하면 확장이 설치된 Visual Studio의 실험적 인스턴스가 시작됩니다. 실험적 인스턴스는 Visual Studio의 일반 버전이지만 별도의 설정 및 확장이 설치되어 있습니다. 이 인스턴스는 항목을 분리해 두는 데 도움이 됩니다.

실험적 인스턴스가 시작되면 Edit 주 메뉴에 Insert GUID 명령이 표시됩니다.

Insert GUID command located in the Edit main menu.

텍스트 기반 파일을 열고 명령을 실행하여 새 GUID를 삽입합니다. 정말 간단하죠.

요약

이제 주 메뉴에 명령 단추를 추가하고 실행 시 텍스트 편집기와 상호 작용하는 첫 번째 확장을 만들었습니다.

축하합니다!

샘플 리포지토리에서 이 확장에 대한 코드를 찾을 수 있습니다.