다음을 통해 공유


VisualStudio.Extensibility SDK 및 VSSDK를 함께 사용

VisualStudio.Extensibility 모델은 주로 devenv.exe 프로세스 외부에서 확장을 호스트하기 위해 만들어졌지만 Visual Studio 프로세스에서 실행되고 Microsoft.VisualStudio.Sdk 패키지에서 제공하는 기존 확장성 API를 활용하는 확장에서 VisualStudio.Extensibility SDK API를 사용할 수 있습니다.

In-proc 사용 지원은 Microsoft.VisualStudio.Sdk에 의존하면서 새로운 VisualStudio.Extensibility API에 대한 얼리어답터를 허용하기 위한 것입니다.

이 문서는 VisualStudio.Extensibility SDK in-proc를 활용하는 다양한 옵션에 대한 빠른 연습입니다.

  • 새 확장을 개발하는 경우 이 자습서에 따라 In-Process에서 호스트되는 VisualStudio.Extension을 만드는 것이 좋습니다. 이 메서드를 사용하면 VSSDK 및 MEF 서비스를 삽입할 수 있을 뿐만 아니라 VisualStudio.Extensibility SDK의 전체 기능을 사용할 수 있습니다.

  • 기존 VSSDK 확장이 있는 경우 다음 팁을 따라 확장에서 새 VisualStudioExtensibility 인스턴스를 사용할 수 있습니다.

  • VisualStudio.Extensibility SDK를 사용하여 명령, 디버그 시각화 도우미, 도구 창을 기존 VSSDK 확장에 추가하려는 경우 이러한 팁을 참조하여 동일한 VS 확장 프로젝트에서 VSSDK 확장과 VisualStudio.Extensibility 확장을 모두 호스트할 수 있습니다.

첫 번째 VSSDK 호환 VisualStudio.Extensibility 확장 만들기

VisualStudio.Extensibility 모델은 주로 devenv.exe 프로세스 외부에서 확장을 호스트하기 위해 만들어졌지만 Visual Studio 2022 17.4 미리 보기 1부터는 devenv.exe 내에서 호스트되고 Microsoft.VisualStudio.Sdk 패키지에서 제공하는 기존 확장성 API를 사용할 수 있는 VisualStudio.Extensibility 확장을 빌드할 수 있습니다.

필수 조건

  • 워크로드가 있는 Visual Studio 2022 버전 17.9 미리 보기 1 이상 Visual Studio extension development .
  • 이전 빌드에서 업데이트하는 경우 잠재적 충돌을 방지하려면 VisualStudio.Extensibility Project System을 제거해야 합니다.

확장 프로젝트 만들기

  • VS SDK 호환성 템플릿과 함께 VisualStudio.Extensibility Extension을 사용하여 새 솔루션을 만듭니다.

Screenshot of the VisualStudio.Extensibility in-process extension project template.

확장 디버그

  • 컨테이너 프로젝트를 시작 프로젝트설정하고 키를 눌러 F5 디버깅을 시작합니다.

  • 키를 누르면 F5 확장이 빌드되고 사용 중인 Visual Studio 버전의 실험적 인스턴스에 배포됩니다. 확장이 로드되면 디버거가 연결되어야 합니다.

  • 다음 이미지와 Extensions 같이 메뉴에서 명령을 찾을 수 있습니다.

    Screenshot showing sample extension command.

VisualStudio.Extensibility 확장에서 Visual Studio SDK 서비스 사용

VS-SDK 호환 확장 프로젝트는 모든 Visual Studio SDK의 서비스에 액세스할 수 있는 Microsoft.VisualStudio.Sdk 패키지를 참조합니다.

일반적으로 이러한 서비스는 MEF 또는 AsyncServiceProvider를 통해 소비됩니다. VisualStudio.Extensibility extender는 대신 .NET 종속성 주입권장합니다.

네임스페이 MefInjection<TService> 스의 클래스 및 AsyncServiceProviderInjection<TService, TInterface> 클래스를 사용하면 종속성 주입( Microsoft.VisualStudio.Extensibility.VSSdkCompatibility 예: 명령, 도구 창 또는 확장 파트)을 통해 인스턴스화된 클래스의 생성자에 추가하여 Visual Studio SDK의 서비스를 사용할 수 있습니다.

다음 예제에서는 명령에 서비스를 추가할 수 있는 방법을 DTE2IBufferTagAggregatorFactoryService 보여 줍니다.

    [VisualStudioContribution]
    public class Command1 : Command
    {
        private TraceSource traceSource;
        private AsyncServiceProviderInjection<DTE, DTE2> dte;
        private MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService;

        public Command1(
            VisualStudioExtensibility extensibility,
            TraceSource traceSource,
            AsyncServiceProviderInjection<DTE, DTE2> dte,
            MefInjection<IBufferTagAggregatorFactoryService> bufferTagAggregatorFactoryService)
            : base(extensibility)
        {
            this.dte = dte;
            this.bufferTagAggregatorFactoryService = bufferTagAggregatorFactoryService;
        }
    
        public override CommandConfiguration CommandConfiguration => new("Sample Remote Command")
        {
            Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
            Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        };

VSSDK 호환 VisualStudio.Extensibility 확장 분석

VS SDK 호환성 템플릿에서 VisualStudio.Extensibility Extension을 사용하면 전체 솔루션을 설정할 수 있지만 VS-SDK 호환 VisualStudio.Extensibility 확장의 기본 구성 요소는 무엇이며 "첫 번째 확장 만들기" 가이드설명된 일반적인 변형과 어떻게 다른지 아는 것이 유용합니다.

컨테이너 프로젝트

VS-SDK 호환 VisualStudio.Extensibility 솔루션은 다음 두 개의 프로젝트로 구성됩니다.

  1. VisualStudio.Extensibility 및 Visual Studio SDK 패키지를 모두 참조하고 확장의 모든 코드를 포함하는 클래스 라이브러리
  2. 확장을 배포하고 디버그하는 데 사용하는 컨테이너 VSIX 프로젝트입니다.

VisualStudio.Extensibility가 미리 보기 상태이고 최종 패키징 및 배포 디자인이 완료되는 동안 이 분리는 임시 솔루션입니다.

extender는 컨테이너 프로젝트에 코드, 콘텐츠 또는 리소스를 추가하면 안 됩니다. 컨테이너 프로젝트의 유일한 목표는 다른 프로젝트에서 제공하는 자산을 포함하는 것입니다.

TargetFramework

확장 프로젝트와 컨테이너 프로젝트 모두 대상 Visual Studio 버전에서 사용하는 .NET 버전을 대상으로 해야 합니다. Visual Studio 2022의 경우 .NET Framework 4.7.2를 대상으로 해야 합니다.

RequiresInProcessHosting 속성

클래스는 Extension 확장을 in-process로 식별하는 속성으로 구성 RequiresInProcessHosting = true 해야 합니다.

[VisualStudioContribution]
internal class MyExtension : Extension
{
    public override ExtensionConfiguration? ExtensionConfiguration => new()
    {
        RequiresInProcessHosting = true,
    };

    ...

기존 VSSDK 확장에서 VisualStudio.Extensibility 사용

기존 VSSDK 확장의 경우 또 다른 옵션은 서비스 공급자를 통해 VisualStudioExtensibility 인스턴스를 쿼리하고 해당 메서드를 활용하는 것입니다. 이 메서드를 사용하면 기존 구성 요소에서 VisualStudio.Extensibility SDK의 새 API 노출 영역을 사용할 수 있습니다. 이 옵션은 새 VisualStudio.Extensibility 기반 확장을 만들지 않고 새 API를 사용하여 프로젝트 정보, 문서 관리를 쿼리하려는 경우에 유용할 수 있습니다.

다음은 VSSDK 패키지 내에서 사용할 VisualStudioExtensibility 수 있는 방법을 보여 주는 예제 코드 조각입니다.

  • .csproj 파일에 VisualStudio.Extensibility API에 대한 패키지 참조를 포함합니다.
  <ItemGroup>
    <PackageReference Include="Microsoft.VisualStudio.Extensibility" Version="17.9.23-preview-1" />
  </ItemGroup>
  • 이제 패키지 또는 다른 구성 요소의 메서드를 통해 GetServiceAsync VisualStudioExtensibility 인스턴스를 쿼리할 수 있습니다.
...
using Microsoft.VisualStudio.Extensibility;
...

public class VSSDKPackage : AsyncPackage
{
    protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
    {
        VisualStudioExtensibility extensibility = await this.GetServiceAsync<VisualStudioExtensibility, VisualStudioExtensibility>();
        await extensibility.Shell().ShowPromptAsync("Hello from in-proc", PromptOptions.OK, cancellationToken);
        ...
    }
}

기존 VSSDK 확장 프로젝트에 VisualStudio.Extensibility 확장 추가

도구 창, 기존 VSSDK 확장 내에서 VisualStudio.Extensibility SDK를 사용하는 편집기 수신기와 같은 구성 요소를 기여하려면 프로젝트에 VisualStudio.Extensibility Extension 인스턴스를 만드는 추가 단계를 따라야 합니다.

  • VisualStudio.Extensibility SDK 패키지를 활용하려면 SDK 스타일 .csproj 이 필요합니다. 기존 프로젝트의 경우 SDK 스타일 1로 업데이트 .csproj 해야 할 수 있습니다.

  • VisualStudio.Extensibility에 대한 Microsoft.VSSDK.BuildTools 패키지 참조를 제거하고 대신 패키지 참조를 추가합니다.

    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.23-preview-1" />
    <PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.23-preview-1" />
  • 프로젝트 파일에 속성을 추가하여 VssdkCompatibleExtension .로 설정합니다 true. 이 속성은 호환성을 위해 일부 VSSDK 기능을 사용하도록 설정합니다.
<PropertyGroup>
    <VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>    

이제 VisualStudio.Extensibility의 모든 기능을 기존 VSSDK 확장과 함께 사용할 수 있습니다.