使用 VisualStudio.Extensibility 的扩展通常具有多个组件,这些组件也与 Visual Studio 进行交互。
扩展实例
扩展必须具有派生自 Extension
的类。 有关示例实现,请参阅 MarkdownLinter。
Extension
类的实例是扩展执行的起点。 此实例包含 Visual Studio 查询扩展提供的服务所需的方法。 它还为扩展提供虚拟方法,以提供本地化资源和扩展拥有的本地服务,以便在扩展的组件之间共享。
Extension
类的配置还包括扩展的 元数据,这些元数据显示在 Visual Studio 管理扩展窗口 中,并且,对于已发布的扩展,则显示在 Visual Studio Marketplace上。
[VisualStudioContribution]
public class MarkdownLinterExtension : Extension
{
/// <inheritdoc/>
public override ExtensionConfiguration ExtensionConfiguration => new()
{
Metadata = new(
id: "MarkdownLinter.0cf26ba2-edd5-4419-8646-a55d0a83f7d8",
version: this.ExtensionAssemblyVersion,
publisherName: "Microsoft",
displayName: "Markdown Linter Sample Extension",
description: "Sample markdown linter extension"),
};
...
对于熟悉现有 VSSDK API 的扩展开发人员,Metadata
中包含的 ExtensionConfiguration
用于生成 .vsixmanifest
文件。 此外,Extension
类类似于 VSSDK 扩展性模型中使用的 AsyncPackage
类。
VisualStudioExtensibility 对象
对象 VisualStudioExtensibility
充当 Visual Studio 公开的扩展性功能的入口点。 此类具有各种扩展方法和属性,可用于快速枚举扩展性 SDK 中的可用功能。 有关可用方法,请参阅 API 文档。
扩展部件
对于扩展为 Visual Studio 提供组件(如命令、编辑器侦听器)的功能,扩展将使用特性化类。 生成过程将生成正确的元数据,以确保 Visual Studio 能够发现这些组件。
对于扩展为 Visual Studio 提供组件的功能(如命令、编辑器侦听器、工具窗口等),扩展使用标有 VisualStudioContribution
属性的类。 生成过程生成正确的元数据,以确保 Visual Studio 能够发现这些组件。
目前,SDK 支持一组有限的组件供稿:
这些类的实例是 SDK 使用依赖项注入库提供的扩展性框架的一部分创建的,构造函数可用于检索 SDK 或扩展本身提供的服务的实例,以便跨组件共享状态。
扩展部件的生存期
每个部件的生存期由在 Visual Studio IDE 进程中加载这些部件的相应组件管理。
命令处理程序在激活相应的命令集时初始化,而激活可能发生在命令第一次执行期间。 激活后,命令处理程序仅应在 IDE 关闭时被释放。
同样,在 IDE 中加载与指定内容类型匹配的第一个文本视图时,将初始化文本视图事件侦听器。 目前,此类侦听器处于活动状态,直到 IDE 关闭,但此行为将来可能会更改。
通常,对于复杂的扩展,我们建议扩展提供本地服务,部件可以在其构造函数中导入这些服务,并使用它们在不同部件之间以及同一部件的不同实例之间共享状态。 这种做法可确保扩展状态不受扩展部件生存期更改的影响。
SDK 提供注入和本地扩展服务
VisualStudio.Extensibility SDK 利用依赖注入允许组件获取内置服务和扩展在本地提供的服务,并在不同组件之间共享。 有关 SDK 提供的服务、服务生命周期和依赖项注入示例用例的更多详细信息,请参阅 依赖项注入 部分。
有关如何使用本地服务的示例,请参阅 MarkdownLinter 扩展。
客户端上下文
由于新 SDK 中的所有扩展都用尽了进程,因此我们引入了各种扩展部件的客户端上下文概念,以表示调用事件或方法时 IDE 的状态。 此上下文由 SDK 中的 IClientContext
实例表示,并传递到各种操作,例如命令执行处理程序。 SDK 提供用于从上下文中检索对象的 IClientContext
扩展方法。 例如,扩展可以在使用 IClientContext
实例执行命令时获取所选项的活动文本视图或 URI。
某些组件(如命令)还允许声明它们感兴趣的上下文。 这样做是为了优化每个远程执行中传输的数据量,因为客户端上下文将来可能会很大。 在初始预览版中,只有两个可用的上下文,Shell
和 Editor
,在使用 CommandAttribute
声明命令时,默认包含这两个上下文。