创建首个 Visual Studio 扩展

本文档是一个快速入门,介绍如何使用 VisualStudio.Extensibility 创建第一个扩展。 扩展在进程外运行,这意味着在 Visual Studio 进程之外。

先决条件

  • 具有 Visual Studio extension development 工作负载的 Visual Studio 2022 版本 17.9 预览版 1 或更高版本。

创建扩展项目

  • 使用 VisualStudio.Extensibility Project 模板创建新的扩展性项目。

Screenshot of the VSExtensibility template.

此时,你可以通过将命令和编辑器组件添加到扩展来开始扩展 Visual Studio。

Extension 类

该模板创建一个扩展 Extension的类。 此类是加载扩展时实例化的第一个类。 在方法中 InitializeServices ,可以将自己的服务添加到服务集合,使其可用于依赖项注入。

[VisualStudioContribution]
internal class ExtensionEntrypoint : Extension
{
    protected override void InitializeServices(IServiceCollection serviceCollection)
    {
        base.InitializeServices(serviceCollection);

        // You can configure dependency injection here by adding services to the serviceCollection.
    }
}

还可以查看 VisualStudioContribution 用于标记 Visual Studio 将使用的扩展组件的属性。 此属性可以应用于实现 IVisualStudioContributionClass 类型的 IVisualStudioContributionProperty类或静态属性。

添加第一个命令

该模板创建 Command1.cs 为第一个命令处理程序,你可以将其用作起点。 由于我们希望让 Visual Studio 知道此命令,并且 Command 类实现 IVisualStudioContributionClass,因此该命令将标有该 VisualStudioContribution 属性。

[VisualStudioContribution]
internal class Command1 : Command
{

该命令具有一个名为 CommandConfiguration的配置属性,该属性定义其显示名称、图标和菜单下 Extensions 的位置。

    public override CommandConfiguration CommandConfiguration => new("%MyExtension.Command1.DisplayName%")
    {
        // Use this object initializer to set optional parameters for the command. The required parameter,
        // displayName, is set above. DisplayName is localized and references an entry in .vsextension\string-resources.json.
        Icon = new(ImageMoniker.KnownValues.Extension, IconSettings.IconAndText),
        Placements = new[] { CommandPlacement.KnownPlacements.ExtensionsMenu },
    };

生成扩展时,C# 编译器会评估配置属性,其值将保存为扩展元数据,以便 Visual Studio 可以在不加载扩展程序集的情况下读取它。 因此,与普通属性相比,配置属性具有其他限制(例如,必须只读)。

可以看到命令的显示名称,"%MyExtension.Command1.DisplayName%"它引用文件中的MyExtension.Command1.DisplayName.vsextension/string-resources.json字符串,允许本地化此字符串。

执行命令时,Visual Studio 将调用 ExecuteCommandAsync 方法,可在其中放置断点。 可以利用 context 参数或 this.Extensibility 对象与 Visual Studio 进行交互。

例如,命令处理程序可能如下所示:

public override async Task ExecuteCommandAsync(IClientContext context, CancellationToken cancellationToken)
{
    await context.ShowPromptAsync(
        "Hello from an extension!", 
        PromptOptions.OK, 
        cancellationToken);
}

有关如何添加命令的详细信息,请参阅 “命令” 部分。

调试扩展

  1. 请确保在 Visual Studio 中选择扩展项目作为启动项目,然后按 F5 开始调试。

  2. 按生成 F5 扩展并将其部署到正在使用的 Visual Studio 版本的实验实例。 加载扩展后,调试器应附加。

  3. 可以在菜单中找到新命令 Extensions ,如下图所示:

    Screenshot showing sample command.

后续步骤

如果错过了介绍性概述,请参阅 “欢迎使用 VisualStudio.Extensibility”文档

现在创建一个稍微更有趣的扩展;请参阅 “创建简单扩展”。