创建首个 Visual Studio 扩展
本文档是一个快速入门,介绍如何使用 VisualStudio.Extensibility 创建第一个扩展。 扩展在进程外运行,这意味着在 Visual Studio 进程之外。
先决条件
- 具有
Visual Studio extension development
工作负载的 Visual Studio 2022 版本 17.9 预览版 1 或更高版本。
创建扩展项目
- 使用
VisualStudio.Extensibility Project
模板创建新的扩展性项目。
此时,你可以通过将命令和编辑器组件添加到扩展来开始扩展 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);
}
有关如何添加命令的详细信息,请参阅 “命令” 部分。
调试扩展
请确保在 Visual Studio 中选择扩展项目作为启动项目,然后按
F5
开始调试。按生成
F5
扩展并将其部署到正在使用的 Visual Studio 版本的实验实例。 加载扩展后,调试器应附加。可以在菜单中找到新命令
Extensions
,如下图所示:
后续步骤
如果错过了介绍性概述,请参阅 “欢迎使用 VisualStudio.Extensibility”文档。
现在创建一个稍微更有趣的扩展;请参阅 “创建简单扩展”。