이 문서에서는 첫 번째 Visual Studio 확장을 시작하고 실행하기 위한 몇 가지 간단한 단계를 안내합니다. Visual Studio 확장은 .NET Framework 및 C#을 사용하여 작성됩니다. 이미 .NET 개발자인 경우 확장 작성은 대부분의 다른 .NET 프로그램 및 라이브러리 작성과 유사합니다.
오늘 작성할 확장은 실행 시 텍스트 편집기에 새 GUID를 삽입하는 명령을 추가합니다. 간단하고 유용하며 확장 개발의 다양한 측면을 잘 소개합니다.
시각적 학습자인 경우 자습서를 따르는 사람의 이 짧은 비디오를 확인하세요.
첫 번째 Visual Studio 확장 작성을 시작하기 전에(쉽게 약속합니다.) 필요한 도구가 있는지 확인합니다.
프로젝트를 만듭니다.
선택할 수 있는 몇 가지 프로젝트 템플릿이 있으므로 올바른 선택을 할 수 있습니다. 이 커뮤니티 도구 키트에 사용되는 템플릿에는 모두 이름에 모니커 (커뮤니티) 가 있습니다.
명령(Community)을 사용하는 VSIX 프로젝트 템플릿에는 명령이 연결되어 있으므로 여기에서 쉽게 시작할 수 있습니다. 이것은 대부분의 확장에 대 한 좋은 시작점입니다. 도구 창을 원하는 경우 도구 창(커뮤니티) 템플릿을 사용하여 VSIX 프로젝트를 사용합니다. 도구 창을 여는 명령도 있습니다.
MEF 전용 확장 또는 기타 고급 시나리오에는 빈 VSIX 프로젝트(커뮤니티) 또는 VSIX 프로젝트(커뮤니티) 템플릿을 사용합니다.
이번에는 아래 스크린샷과 같이 명령(커뮤니티) 템플릿을 사용하여 VSIX 프로젝트를 선택합니다.
프로젝트 템플릿을 선택한 후 프로젝트 이름을 지정해야 합니다. InsertGuid라고 합니다.
만들기 단추를 누른 후에는 다음과 같은 기본 VSIX 프로젝트로 끝나야 합니다.
중요 파일
가장 중요한 파일을 살펴보겠습니다.
InsertGuidPackage.cs 패키지 클래스라고 합니다. Visual Studio에서 해당 InitializeAsync(...) 메서드를 호출하여 확장을 초기화합니다. 여기에서 이벤트 수신기를 추가하고 명령, 도구 창, 설정 및 기타 항목을 등록합니다.
source.extension.vsixmanifest 는 확장에 대한 매니페스트 파일입니다. 여기에는 제목 및 설명과 같은 메타 데이터뿐만 아니라 확장에 포함된 내용에 대한 정보도 포함됩니다.
VSCommandTable.vsct 는 명령 및 키 바인딩이 선언적으로 정의되어 Visual Studio에 등록할 수 있는 XML 파일입니다.
명령/MyCommand.csVSCommandTable.vsct 파일에 정의된 명령에 대한 명령 처리기입니다. 단추를 클릭하여 명령이 실행될 때 발생하는 동작을 제어합니다.
명령 수정
먼저 명령에 Visual Studio 메뉴 시스템 내에서 올바른 이름, 아이콘 및 위치가 있는지 확인하려고 합니다.
VSCommandTable.vsct 파일을 열고 <Group>과 <Button>를 찾으세요. 단추가 그룹을 부모로 지정하고 그룹의 부모가 기본 제공 VSMainMenu/도구 메뉴인 방법을 확인합니다.
확장의 경우 GUID 삽입 명령 단추가 편집 주 메뉴 아래에 있으므로 그룹을 편집 메뉴로 다시 부모로 지정하려고 합니다. 다음 코드 조각과 마찬가지로 도구를편집 으로 바꿉다.
<Group guid="InsertGuid" id="MyMenuGroup" priority="0x0600">
<Parent guid="VSMainMenu" id="Edit"/>
</Group>
올바른 위치를 쉽게 찾을 수 있도록 배치에 대한 전체 IntelliSense를 얻을 수 있습니다.
<Button> 업데이트도 필요합니다.
id 요소의 <Icon> 특성을 PasteAppend로 업데이트하여 새 아이콘을 제공합니다.
<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에 표시된 미리 보기를 가져올 수도 있습니다.
이제 명령의 이름, 아이콘 및 위치를 업데이트했으며, 이제 일부 코드를 작성하여 텍스트 편집기에 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는 Visual Studio IDE UI 요소에 대한 액세스를 제공하는 정적 개체입니다. VSIX 커뮤니티 도구 키트 GitHub 리포지토리의 VS.cs 해당 정의를 참조하세요.
비고
이 커뮤니티 도구 키트의 여러 위치에서 await JoinableTaskFactory.SwitchToMainThreadAsync() 및 ThreadHelper.ThrowIfNotOnUIThread()을(를) 볼 수 있습니다. 스레드 전환 모범 사례를 처리하며, 이 시점에서는 사용 시기나 방법을 알 필요가 없습니다. 컴파일러 경고에 표시되는 코드 수정(전구)을 통해 쉽게 해결할 수 있습니다.
이제 확장의 첫 번째 초안이 완료되었으며 테스트할 때입니다.
실행 및 디버깅
확장을 실행하는 것은 다른 .NET 프로젝트를 실행하는 것만큼 쉽습니다. F5 키를 눌러 디버거가 연결된 상태로 실행하거나 Ctrl+F5를 눌러 실행하지 않고 실행합니다.
이렇게 하면 확장이 설치된 Visual Studio의 실험적 인스턴스가 시작됩니다. 실험적 인스턴스는 Visual Studio의 일반 버전이지만 별도의 설정과 확장이 설치되어 있습니다. 그것은 물건을 별도로 유지하는 데 도움이됩니다.
실험적 인스턴스가 시작되면 기본 편집 메뉴에 GUID 삽입 명령이 표시됩니다.
텍스트 기반 파일을 열고 명령을 실행하여 새 GUID를 삽입합니다. 이것으로 끝입니다.
요약
이제 주 메뉴에 명령 단추를 추가하고 실행할 때 텍스트 편집기와 상호 작용하는 첫 번째 확장을 만들었습니다.
축하합니다!!
샘플 리포지토리에서 이 확장에 대한 코드를 찾을 수 있습니다.