다음을 통해 공유


VisualStudio.Extensibility 확장의 구성 요소

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"),
    };
    ...

기존 VS SDK API에 익숙한 확장 개발자의 경우 ExtensionConfiguration 포함된 Metadata API를 사용하여 .vsixmanifest 파일을 생성합니다. 또한, 이 Extension 클래스는 VS SDK 확장성 모델에 사용되는 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에서 제공하는 서비스

다음 서비스는 모든 확장 파트의 생성자에서 사용할 수 있는 SDK에서 제공됩니다.

  • VisualStudioExtensibility: 모든 확장 파트는 Visual Studio IDE와 상호 작용하는 인스턴스 VisualStudioExtensibility 를 삽입할 수 있습니다.

  • Extension: 파트는 Microsoft.VisualStudio.Extensibility.Extension 형식을 삽입하거나 확장 파트에서 확장 파트로 상속하는 고유한 형식을 삽입 할 수 있습니다.

  • TraceSource: 진단 정보를 기록하는 데 사용할 수 있는 각 확장에 대해 요청 시 추적 원본 인스턴스가 만들어집니다. 이러한 인스턴스는 여러 서비스의 로그를 병합하고 향후 도구를 활용하여 실시간 로깅에 액세스하는 데 사용할 수 있는 Visual Studio 진단 공급자에 등록됩니다. 로깅을 참조하세요.

  • 로컬 서비스: 확장 자체에서 제공하는 모든 로컬 서비스도 종속성 주입에 사용할 수 있습니다.

  • MefInjection<TService>AsyncServiceProviderInjection<TService, TInterface>: In-proc 확장은 MEF 또는 AsyncServiceProvider를 통해 전통적으로 사용되는 Visual Studio SDK 서비스를 삽입할 수 있습니다.

로컬 확장 서비스

특정 시나리오에서 확장은 MarkdownLinter 예를 들어 볼 수 있듯이 명령 처리기 및 텍스트 뷰 변경 수신기와 같은 여러 구성 요소 간에 상태를 공유하려고 할 수 있습니다. 이러한 서비스는 Extension.InitializeServices 메서드를 재정의하여 In Process 서비스 컬렉션에 추가할 수 있으며 확장 파트의 인스턴스가 만들어질 때 서비스는 생성자 인수에 따라 삽입됩니다.

서비스를 추가하기 위한 세 가지 옵션이 있습니다.

  • AddTransient: 서비스를 수집하는 각 부분에 대해 서비스의 새 인스턴스가 만들어집니다.
  • AddScoped: 서비스의 새 인스턴스가 특정 범위 내에 만들어집니다. Visual Studio 확장성의 컨텍스트에서 범위는 단일 확장 부분을 나타냅니다.
  • AddSingleton: 첫 번째 수집 시 생성되는 단일 공유 서비스 인스턴스가 있습니다.

개체의 수 VisualStudioExtensibility 명이 단일 확장 파트의 범위에 바인딩되기 때문에 개체를 수집하는 모든 로컬 서비스는 범위가 지정되거나 일시적인 서비스여야 합니다. 삽입하는 싱글톤 서비스를 만들려고 하면 오류가 발생합니다 VisualStudioExtensibility .

로컬 서비스를 사용하는 방법의 예는 MarkdownLinter 확장을 참조 하세요.

클라이언트 컨텍스트

새 SDK의 모든 확장은 프로세스가 부족하므로 이벤트 또는 메서드가 호출될 때 IDE의 상태를 나타내는 다양한 확장 파트에 대한 클라이언트 컨텍스트의 개념을 소개합니다. 이 컨텍스트는 SDK의 IClientContext 인스턴스에서 나타내며 명령 실행 처리기와 같은 다양한 작업에 전달됩니다. SDK는 컨텍스트에서 개체를 IClientContext 검색하는 데 사용할 수 있는 확장 메서드를 제공합니다. 예를 들어 확장은 인스턴스를 활용하는 명령 실행 시 선택한 항목에 대한 활성 텍스트 보기 또는 URI를 IClientContext 가져올 수 있습니다.

명령과 같은 일부 구성 요소를 사용하면 관심 있는 컨텍스트를 선언할 수도 있습니다. 이 작업은 클라이언트 컨텍스트가 나중에 커질 수 있으므로 각 원격 실행에서 전송되는 데이터의 양을 최적화하기 위해 수행됩니다. 초기 미리 보기에는 사용 가능한 컨텍스트가, Shell 그리고 Editor 두 개뿐이며, 둘 다 명령을 CommandAttribute을 사용하여 선언할 때 기본적으로 포함됩니다.