VisualStudio.Extensibility Extensions 的 .NET 兼容性

新的 VisualStudio.Extensibilty 模型允许扩展在单独的 .NET 主机进程中在主 Visual Studio 进程外部运行。 由于 .NET 被用作执行 VisualStudio.Extensibility 扩展的运行时,因此使用 VisualStudio.Extensibility 框架生成的扩展必须与公开支持的 .NET 长期服务 (LTS) 运行时保持同步。

.NET 运行时支持模型

.NET 运行时有自己的生存期和服务时间线,独立于 Visual Studio。 目前的节奏是每年发布一个新的 .NET 版本,奇数编号的主要版本接收 18 个月的支持,而偶数编号的版本则接收 36 个月的长期支持(LTS)。 Visual Studio 始终随附处于公开支持阶段的 .NET LTS 版本。 有关 .NET 运行时及其生存期的官方列表,请参阅此处

以下时间线说明了 Visual Studio 附带的不同 .NET 版本的近似值。

.NET 运行时时间线的屏幕截图。

默认情况下,VisualStudio.Extensibility 扩展性扩展面向任何最早支持的 .NET LTS 运行时。 但是,扩展开发人员可以在其扩展元数据中指定哪些版本的 .NET,其扩展已知支持。 鉴于此信息,Visual Studio 会根据扩展声明的 .NET 运行时版本及其已知的生命周期结束日期选择适当的目标。

对于使用 VisualStudio.Extensibility 的开发人员来说,应该将目标设定为当前的 .NET SDK。 如果为不再公开支持的 .NET 版本开发扩展(因此不再随 Visual Studio 一起提供),则 Visual Studio 将选择可用于运行扩展的最旧公开支持的运行时。 尽管主要 .NET 版本之间的中断性变更影响的可能性较低,但不能保证在以前的 .NET 版本上运行的应用程序将适用于较新的版本,因此无法保证扩展正常工作。

经验

最终用户体验

Visual Studio 将根据声明的受支持的 .NET 版本和 Visual Studio 可用的 .NET 版本选择要用于扩展的 .NET 运行时。 只有在两种情况下,用户才会看到与当前体验的任何不同:

  • 如果扩展仅支持接近生命周期结束的 .NET 版本,则会在扩展管理器窗口中的扩展磁贴上显示信息图标,以通知用户扩展存在不受支持的危险。
  • 如果某个扩展只支持已超过生命周期的 .NET 版本,那么在扩展管理器窗口中的扩展磁贴上将显示警告图标,以提醒用户该扩展在未获得支持声明的 .NET 版本上以最大努力运行,可能无法正常工作。

具有不同 .NET 运行时配置的扩展的屏幕截图。

在这两种情况下,用户都应联系扩展开发人员,并要求他们确保该扩展适用于受支持的 .NET LTS 版本并发布更新的扩展。

开发人员体验 - 调试

对于 VisualStudio.Extensibility 扩展的开发人员,F5 调试体验已经进行了更新,现在允许在调试或测试扩展时选择要使用的 .NET 运行时。 此体验的目的是便于在不同的 .NET 运行时上进行 VisualStudio.Extensibility 扩展的兼容性测试。

现在,当所选启动项目为 VisualStudio.Extensibility 项目时,Visual Studio 附带的 .NET 运行时列表将出现在调试菜单下拉列表下的其他菜单项。 在所选运行时下调试扩展可确保调试的扩展在所选运行时上执行。 在实验实例中,扩展管理器工具窗口中的扩展磁贴显示实验室图标,并指定要评估的 .NET 版本。 以下屏幕截图中通过 Command Sample 扩展演示了这一点。

请注意,该示例是一个精心设计的场景,其中 Visual Studio 包括 .NET 6 和 .NET 8。 在实际版本中,只有受支持的 .NET LTS 版本才会包含在 Visual Studio 中。

设置 F5 调试运行时目标的屏幕截图。F5 调试期间扩展管理器的屏幕截图。

开发人员体验 - 扩展配置

开发人员可以在 ExtensionConfiguration 使用一个可选的 DotnetTargetVersions 字段来指定可作为其扩展目标的一个或多个 .NET 运行时。 此字段接受目标框架标识符列表,例如 net8.0netstandard2.0。 如果提供,此信息允许 Visual Studio 确定应使用哪个运行时来运行扩展。 如果字段留空,则会将 Visual Studio 附带的旧版运行时设置为默认值。

如果扩展项目文件中指定的目标框架名字对象 <TargetFrameworks> 属性中指定的目标框架名字对象与 ExtensionConfiguration中声明或省略的目标框架名字对象不一致,VisualStudio.Extensibility 分析器将引发警告。 如果未在 ExtensionConfiguration中给出任何目标,并且 <TargetFrameworks> 中的任何标识符与所选默认值不兼容,则会引发警告。 如果在 ExtensionConfiguration中给出目标,而 <TargetFrameworks> 中指定的任何标识符与提供的值不兼容,则会引发警告。

例如,如果扩展是面向 netstandard2.0 构建的,则它与任何 .NET 版本兼容。 但是,如果开发人员将 DotnetTargetVersions 留空,并且 net8.0 被选为默认值,则面向 net6.0 构建的扩展会引发警告。

下图显示了一个扩展示例,该扩展以 .NET 8 为目标,但在 DotnetTargetVersions中指定了 .NET 6。

配置为在 .NET 6 上运行的扩展代码的屏幕截图。针对目标 .NET 运行时已不受支持的扩展的生成警告的屏幕截图。

测试和抢先体验

如果要尝试使用多个 .NET 运行时管理扩展,请参阅 VSExtensibility 存储库中包含的脚本。 通过包含的脚本,可以使用 .NET 9 更新任何 Visual Studio 实例。 请注意,.NET 9 不是 .NET 的 LTS 版本,而且这不是受支持的应用场景,但会提供将来开发具有多个 .NET 运行时的 VisualStudio.Extensibility 扩展性扩展体验的示例。