Share via


기여 및 구성

특정 기본 클래스에서 파생하여 확장 구성 요소를 Visual Studio에 노출할 수 있으며, 특정 속성을 정의하고 다양한 특성을 사용하여 구성할 수 있습니다.

Visual Studio 기여

Visual Studio 확장의 목적은 Visual Studio에 새로운 기능을 제공하는 것입니다. 이렇게 하려면 Command, ToolWindow 또는 ExtensionPart 여러 클래스 중 하나를 확장하하고, VisualStudioContribution 특성을 적용합니다.

이 문서에서는 명령 육아 샘플 확장을 참조하여 확장 구성 요소 기여 및 구성의 개념을 설명합니다.

모든 VisualStudio.Extensibility 확장은 하나 Extension 이상의 클래스를 제공해야 합니다.

namespace CommandParentingSample;

[VisualStudioContribution]
public class CommandParentingSampleExtension : Extension
{
    /// <inheritdoc/>
    protected override void InitializeServices(IServiceCollection serviceCollection)
    {
        base.InitializeServices(serviceCollection);
    }
}

Extension 클래스는 확장의 첫 번째 인스턴스화된 클래스이며 종속성 주입에 사용할 고유한 서비스를 IServiceCollection 추가할 수 있습니다.

명령 육아 샘플은 Visual Studio에 다른 클래스인 Command를 제공합니다.

[VisualStudioContribution]
internal class SampleCommand : Command
{
    public SampleCommand()
    {
    }
    ...

VisualStudio.Extensibility SDK에서 제공하는 기본 클래스를 확장할 때 기본 클래스가 구현하는지 IVisualStudioContributionClass (둘 다 Extension 그리고 Command 해당) 검사 VisualStudioContribution 특성을 사용해야 하는지 여부를 알 수 있습니다.

Visual Studio 기여 클래스는 지연 인스턴스화된 싱글톤입니다. 하나의 인스턴스만 만들어지고 Visual Studio가 상호 작용해야 할 때까지 생성이 지연됩니다(예: 사용자가 처음 호출하는 경우 Command ).

또한 VisualStudio.Extensibility 인프라를 사용하면 IServiceCollectionExtension 클래스의 InitializeServices 메서드에 추가한 서비스를 포함하여 Visual Studio 기여 클래스의 생성자 매개 변수로 종속성 주입을 통해 서비스를 받을 수 있습니다( 삽입을 위해 SDK에서 제공하는 서비스참조).

Visual Studio에서는 종종 고유 식별자를 기여 연결해야 합니다. 대부분의 경우 VisualStudio.Extensibility 인프라는 Visual Studio 기여 클래스의 전체 이름을 기여 식별자로 사용합니다. 예를 들어 위 클래스의 Extension 식별자는 다음과 같습니다 CommandParentingSample.CommandParentingSampleExtension. Visual Studio 로그 및 오류 메시지에 표시될 수 있으므로 Visual Studio 기여 클래스의 형식 이름 및 네임스페이스를 신중하게 선택할 수 있습니다.

Visual Studio 기여 구성

대부분의 Visual Studio 기여 클래스는 구성을 요구하거나 허용합니다. 예를 들어 Command 추상 클래스는 적어도 명령의 CommandConfiguration 표시 이름 및 선택적으로 배치와 같은 다른 속성을 지정하는 속성을 구현해야 합니다.

[VisualStudioContribution]
internal class SampleCommand : Command
{
    /// <inheritdoc />
    public override CommandConfiguration CommandConfiguration => new("%CommandParentingSample.SampleCommand.DisplayName%")
    {
        Placements = new[]
        {
            // File in project context menu
            CommandPlacement.VsctParent(new Guid("{d309f791-903f-11d0-9efc-00a0c911004f}"), id: 1072, priority: 0),

            // Project context menu
            CommandPlacement.VsctParent(new Guid("{d309f791-903f-11d0-9efc-00a0c911004f}"), id:  1026, priority: 0),

            // Solution context menu
            CommandPlacement.VsctParent(new Guid("{d309f791-903f-11d0-9efc-00a0c911004f}"), id:  1043, priority: 0),
        },
    };
    ...

CommandConfiguration컴파일 시간 상수로, 확장이 빌드되고 확장 매니페스트(extension.json)에 포함될 때 해당 값이 평가됨을 의미합니다. Visual Studio는 확장 자체를 로드하지 않고 확장 매니페스트를 읽을 수 있으므로 성능이 향상됩니다.

컴파일 시간 상수 는 일반 속성에 비해 추가 제한 사항이 적용됩니다. 예를 들어 읽기 전용이어야 하며 초기화 코드에는 비정적 멤버 또는 다중 문 명령 코드 블록에 대한 참조를 포함할 수 없습니다. 이러한 제한은 VisualStudio.Extensibility 빌드 도구에 의해 적용되며 다음과 같은 오류 메시지가 발생합니다.

컴파일 시간 상수 SampleCommand.CommandConfiguration을 평가할 때 문제가 발생했습니다. 컴파일 시간 상수 값을 평가할 때 사용자 정의 비정적 멤버에 대한 참조는 지원되지 않습니다.

일반적으로 확장은 런타임에 컴파일 시간 상수 구성 속성을 참조해서는 안 됩니다.

해당 정의에 CompileTimeEvaluation 특성이 있으므로 컴파일 시간 상수 구성 속성을 쉽게 식별할 수 있습니다.

public abstract class Command : ExecutableCommandHandler, IVisualStudioContributionClass
{
    ...
    /// <summary>
    /// Gets the configuration for this command. The value of this property is evaluated at compile time
    /// when building the Visual Studio extension.
    /// </summary>
    [CompileTimeEvaluation]
    public abstract CommandConfiguration CommandConfiguration { get; }
    ...

드문 경우지만 구성 속성은 선택 사항일 수 있습니다. 경우에 따라 동일한 클래스에서 여러 구성 속성을 구현해야 할 수 있습니다. 이는 여러 인터페이스를 ExtensionPart 확장하고 구현할 때 일반적이며, 각각 자체 구성 속성이 필요한 인터페이스입니다.

독립 실행형 구성 속성

위에서 설명한 대로 Visual Studio 기여 클래스는 일반적으로 하나 이상의 컴파일 시간 상수 구성 속성을 노출하는 싱글톤 클래스를 정의합니다. 구성 속성 값은 확장 메타데이터로 저장됩니다.

일부 확장성 기능을 사용하려면 클래스에 연결되지 않은 확장 메타데이터를 지정해야 하며 자체적으로 의미가 있거나 다른 구성에서 참조해야 합니다. 몇 가지 예는 메뉴, 도구 모음 및 문서 형식 정의입니다. 이 작업은 정적 읽기 전용 구성 속성에 VisualStudioContribution 특성을 적용하여 수행됩니다.

Visual Studio 기여 속성은 모든 클래스에 배치할 수 있습니다.

명령 양육 샘플은 형식 ToolbarConfiguration 의 정적 속성을 선언하고 이를 VisualStudioContribution로 표시하여 도구 모음을 정의합니다.

namespace CommandParentingSample;

internal static class ExtensionCommandConfiguration
{
    [VisualStudioContribution]
    public static ToolbarConfiguration ToolBar => new("%CommandParentingSample.ToolBar.DisplayName%")
    {
        Children = new[]
        {
            ToolbarChild.Command<SampleCommand>(),
        },
    };
}

Visual Studio 기여 속성은 컴파일 시간 상수이기도 하며 앞에서 설명한 것과 동일한 제한 사항이 적용됩니다.

Visual Studio 기여 속성은 다른 구성 속성을 참조할 수도 있습니다. 예시:

public static class MenuConfigurations
{
    [VisualStudioContribution]
    public static CommandGroupConfiguration MyCommandGroup => new(GroupPlacement.KnownPlacements.ExtensionsMenu)
    {
        Children = new GroupChild[]
        {
            GroupChild.Menu(MyMenu),
        },
    };

    [VisualStudioContribution]
    public static MenuConfiguration MyMenu => new("%MyMenu.DisplayName%")
    {
        Children = new[]
        {
            MenuChild.Command<MyCommand>(),
        },
    };
    ...

Visual Studio 기여 속성을 정의하는 데 사용되는 형식은 IVisualStudioContributionProperty 인터페이스를 구현하고 확장이 빌드될 때 해당 값이 평가된다는 것을 문서화하는 CompileTimeEvaluation 특성으로 표시됩니다.

[CompileTimeEvaluation]
public sealed class DocumentTypeConfiguration : IVisualStudioContributionProperty ...

런타임에 컴파일 시간 상수 구성 속성을 참조하지 않는 방법에 대한 지침은 Visual Studio 기여 속성에도 적용됩니다.

Visual Studio 기여 속성에 고유 식별자가 필요한 경우 전체 이름(전체 이름 및 속성 이름 형식 포함)은 VisualStudio.Extensibility 인프라에서 식별자로 사용됩니다. 예를 들어 여기서 설명하는 도구 모음 구성의 고유 식별자는 CommandParentingSample.ExtensionCommandConfiguration.ToolbarConfiguration 다음과 같습니다.