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를 활용하는 다양한 옵션에 대한 빠른 연습입니다.
새 확장을 개발하는 경우 이 자습서 을 따라 인프로세스에서 호스팅되는 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 extension development
워크로드가 있는 Visual Studio 2022 버전 17.9 프리뷰 1 이상 - 이전 빌드에서 업데이트하는 경우 잠재적 충돌을 방지하려면 VisualStudio.Extensibility Project System을 제거해야 합니다.
확장 프로젝트 만들기
- VSSDK 호환성 템플릿과 VisualStudio.Extensibility Extension을 사용하여 새 솔루션을 만듭니다.
확장 디버그
F5
눌러 디버깅을 시작하면 확장이 빌드되고 사용 중인 Visual Studio 버전의 실험적 인스턴스에 배포됩니다. 확장이 로드되면 디버거가 연결되어야 합니다.다음 이미지와 같이
Extensions
메뉴에서 명령을 찾을 수 있습니다.
VisualStudio.Extensibility 확장에서 Visual Studio SDK 서비스 사용
VS-SDK 호환 확장 프로젝트는 모든 Visual Studio SDK의 서비스에 액세스할 수 있는 microsoft.VisualStudio.Sdk 패키지 참조합니다.
일반적으로 이러한 서비스는 MEF 또는 AsyncServiceProvider통해 소비됩니다. VisualStudio.Extensibility 확장 기능은 .NET 종속성 주입을 사용하는 것이 권장됩니다.
Microsoft.VisualStudio.Extensibility.VSSdkCompatibility
네임스페이스의 MefInjection<TService>
및 AsyncServiceProviderInjection<TService, TInterface>
클래스를 사용하면 명령, 도구 창 또는 확장 부분과 같은 종속성 주입 통해 인스턴스화된 클래스의 생성자에 추가하여 Visual Studio SDK의 서비스를 사용할 수 있습니다.
다음 예제에서는 DTE2
및 IBufferTagAggregatorFactoryService
서비스를 명령에 추가할 수 있는 방법을 보여 줍니다.
[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 확장의 구성
VSSDK 호환성 템플릿과 함께 VisualStudio.Extensibility Extension을 사용하면 전체 프로젝트를 설정하는 작업을 수행하지만, VS-SDK 호환 VisualStudio.Extensibility 확장의 기본 구성 요소와 "첫 번째 확장 만들기" 가이드설명한 일반적인 변형과 어떻게 다른지 아는 것이 유용합니다.
TargetFramework 및 VssdkCompatibleExtension
확장 프로젝트는 대상 Visual Studio 버전에서 사용하는 .NET 버전을 대상으로 해야 합니다. Visual Studio 2022의 경우 .NET Framework 4.7.2를 대상으로 해야 합니다.
확장 프로젝트 역시 속성이 VssdkCompatibleExtension
로 설정된 true
도 포함되어야 합니다.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
RequiresInProcessHosting 속성
Extension
클래스는 RequiresInProcessHosting = true
속성을 사용하여 내부 프로세스확장을 식별하도록 구성해야 합니다.
[VisualStudioContribution]
internal class MyExtension : Extension
{
public override ExtensionConfiguration? ExtensionConfiguration => new()
{
RequiresInProcessHosting = true,
};
...
패키지 매니페스트
확장 프로젝트에는 패키지 매니페스트source.extension.vsixmanifest
가 포함되어야 합니다.
Installation
태그는 ExtensionType
을 VSSDK+VisualStudio.Extensibility
로 설정해야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<Metadata>
<Identity Id="MyExtensionId.f14b8c45-154f-4584-abd7-9ec22af003e2" Version="1.0" Language="en-US" Publisher="Microsoft" />
<DisplayName>My extension</DisplayName>
<Description xml:space="preserve">My extension's description.</Description>
</Metadata>
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
<ProductArchitecture>amd64</ProductArchitecture>
</InstallationTarget>
<InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[17.9,18.0)">
<ProductArchitecture>arm64</ProductArchitecture>
</InstallationTarget>
</Installation>
<Prerequisites>
<Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[17.0,)" DisplayName="Visual Studio core editor" />
</Prerequisites>
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
</Assets>
</PackageManifest>
기존 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.2092" />
</ItemGroup>
...
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 확장 인스턴스를 만드는 추가 단계를 수행해야 합니다.
VisualStudio.Extensibility SDK 패키지를 활용하려면 SDK 스타일
.csproj
필요합니다. 기존 프로젝트의 경우.csproj
SDK 스타일 1로 업데이트해야 할 수 있습니다.Microsoft.VSSDK.BuildTools
대한 패키지 참조를 제거하고 대신 VisualStudio.Extensibility에 대한 패키지 참조를 추가합니다.
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Sdk" Version="17.9.2092" PrivateAssets="all" />
<PackageReference Include="Microsoft.VisualStudio.Extensibility.Build" Version="17.9.2092" PrivateAssets="all" />
- 프로젝트 파일에
VssdkCompatibleExtension
속성을 추가하고 이를true
로 설정하십시오. 이 속성을 사용하면 호환성을 위해 일부 VSSDK 기능을 사용할 수 있습니다.
<PropertyGroup>
<VssdkCompatibleExtension>true</VssdkCompatibleExtension>
</PropertyGroup>
-
Extension
기본 클래스에서 상속되는 새 확장 클래스를 만들고 앞에서 설명한 대로 RequiresInProcessHosting 속성을 설정합니다. -
source.extension.vsixmanifest
파일을 수정하여ExtensionType="VSSDK+VisualStudio.Extensibility"
을Installation
태그에 추가합니다.
<Installation ExtensionType="VSSDK+VisualStudio.Extensibility">
이제 VisualStudio.Extensibility의 모든 기능을 기존 VSSDK 확장과 함께 사용할 수 있습니다.