VisualStudio.Extensibility를 활용하는 확장에는 일반적으로 Visual Studio와 함께 상호 작용하는 여러 구성 요소가 있습니다.
확장 인스턴스
확장에는 Extension
에서 파생된 클래스가 있어야 합니다. 예제 구현은 MarkdownLinter참조하세요.
Extension
클래스의 인스턴스는 확장 실행의 시작점입니다. 이 인스턴스에는 Visual Studio가 확장에서 제공하는 서비스를 쿼리하는 데 필요한 메서드가 포함되어 있습니다. 또한 확장의 구성 요소 간에 공유할 지역화된 리소스 및 확장 소유 로컬 서비스를 제공하기 위한 가상 메서드를 제공합니다.
Extension
클래스의 구성에는 Visual Studio 확장 관리 창 표시되는 확장에 대한 메타데이터, 게시된 확장의 경우 Visual Studio Marketplace포함됩니다.
[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
/// <inheritdoc/>
public override ExtensionConfiguration ExtensionConfiguration => new()
{
Metadata = new(
id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
version: this.ExtensionAssemblyVersion,
publisherName: "Microsoft",
displayName: "Markdown Linter Sample Extension",
description: "Sample markdown linter extension"),
};
...
기존 VSSDK API에 익숙한 확장 개발자의 경우, Metadata
에 포함된 ExtensionConfiguration
는 .vsixmanifest
파일을 생성하는 데 사용됩니다. 또한 Extension
클래스는 VSSDK 확장성 모델에서 사용되는 AsyncPackage
클래스와 유사합니다.
VisualStudioExtensibility 오브젝트
개체 VisualStudioExtensibility
Visual Studio에서 노출하는 확장성 기능의 진입점 역할을 합니다. 이 클래스에는 확장성 SDK에서 사용 가능한 기능을 통해 빠르게 열거할 수 있는 다양한 확장 메서드, 속성이 있습니다. 사용 가능한 방법은 API 설명서를 참조하세요.
확장 부품
확장이 명령, 편집기 수신기와 같은 Visual Studio에 구성 요소를 기여하는 기능의 경우 확장은 특성 클래스를 활용합니다. 빌드 프로세스는 올바른 메타데이터를 생성하여 Visual Studio에서 이러한 구성 요소를 검색할 수 있도록 합니다.
확장이 명령, 편집기 수신기, 도구 창 등과 같은 Visual Studio에 구성 요소를 제공하는 기능의 경우 확장은 VisualStudioContribution
특성으로 표시된 클래스를 활용합니다. 빌드 프로세스는 올바른 메타데이터를 생성하여 Visual Studio에서 이러한 구성 요소를 검색할 수 있도록 합니다.
현재 SDK는 다음과 같은 제한된 구성 요소 집합을 지원합니다.
- 명령 처리기
- 도구 창
- 텍스트 보기가 열리고 닫히는 이벤트 리스너는 텍스트 보기 생성 및 닫힘 이벤트를 추적합니다.
- 열려 있는 텍스트 보기의 변경 내용을 추적하기 위한 텍스트 보기 변경 수신기.
- 마진 제공자
- 디버거 시각화 도우미
이러한 클래스의 인스턴스는 종속성 주입 라이브러리를 사용하여 SDK에서 제공하는 확장성 프레임워크의 일부로 생성되며, 생성자를 사용하여 SDK 또는 확장 자체에서 제공하는 서비스 인스턴스를 검색하여 구성 요소 간에 상태를 공유할 수 있습니다.
확장 파트의 수명
각 파트의 수명은 Visual Studio IDE 프로세스 내에서 해당 파트를 로드하는 각 구성 요소에 의해 관리됩니다.
명령 처리기는 해당 명령 집합이 활성화될 때 초기화되며, 이는 명령의 첫 번째 실행 중일 수 있습니다. 활성화되면 IDE가 종료될 때만 명령 처리기를 삭제해야 합니다.
마찬가지로 지정한 콘텐츠 형식과 일치하는 첫 번째 텍스트 뷰가 IDE에 로드될 때 텍스트 보기 이벤트 수신기가 초기화됩니다. 현재 이러한 수신기는 IDE가 종료될 때까지 활성화되지만 나중에 이 동작이 변경될 수 있습니다.
일반적으로 복잡한 확장의 경우 확장은 해당 생성자에서 파트를 가져올 수 있는 로컬 서비스를 제공하고 해당 서비스를 사용하여 파트 간 및 동일한 부분의 인스턴스 간에 상태를 공유하는 것이 좋습니다. 이렇게 하면 확장 파트의 수명 변경에 의해 확장 상태가 영향을 받지 않습니다.
삽입 및 로컬 확장 서비스를 위해 SDK에서 제공하는 서비스
VisualStudio.Extensibility SDK는 종속성 주입을 사용하여 구성 요소가 기본 제공 서비스와 확장에서 로컬로 제공하는 서비스를 모두 수집하여 서로 다른 구성 요소 간에 공유할 수 있도록 합니다. SDK에서 제공하는 서비스, 서비스 수명 시간 및 종속성 주입 예제 사용 사례에 대한 자세한 내용은 종속성 주입 섹션을 참조하세요.
로컬 서비스를 사용하는 방법에 대한 예제는 MarkdownLinter 확장참조하세요.
클라이언트 컨텍스트
새 SDK의 모든 확장은 프로세스가 부족하므로 이벤트 또는 메서드가 호출될 때 IDE의 상태를 나타내는 다양한 확장 파트에 대한 클라이언트 컨텍스트의 개념을 소개합니다. 이 컨텍스트는 SDK의 IClientContext
인스턴스로 표시되며 명령 실행 처리기와 같은 다양한 작업에 전달됩니다. SDK는 컨텍스트에서 개체를 검색하는 데 사용할 수 있는 IClientContext
확장 메서드를 제공합니다. 예를 들어 확장은 IClientContext
인스턴스를 활용하는 명령 실행 시 선택한 항목에 대한 활성 텍스트 보기 또는 URI를 가져올 수 있습니다.
명령과 같은 일부 구성 요소를 사용하면 관심 있는 컨텍스트를 선언할 수도 있습니다. 이 작업은 클라이언트 컨텍스트가 나중에 커질 수 있으므로 각 원격 실행에서 전송되는 데이터의 양을 최적화하기 위해 수행됩니다. 초기 미리 보기에는 Shell
및 Editor
사용 가능한 컨텍스트가 두 개뿐이며 CommandAttribute
사용하여 명령을 선언할 때 기본적으로 둘 다 포함됩니다.