2022LogoVisual Studio 2022 版本 17.0 发行说明


提示

观看 Visual Studio 2022 发布活动的录制内容,了解新功能,听取提示和技巧,并下载免费的数字材料。

开发者社区 | Visual Studio 2022 路线图 | 系统要求 | 兼容性 | 可分发代码 | 发行历史记录 | 许可条款 | 博客 | 最新版本已知问题 | Visual Studio 新增功能文档


Visual Studio 2022 版本 17.0

对 Visual Studio 2022 版本 17.0 的支持已于 2023 年 7 月结束,这意味着此版本将不再有安全更新。 使用 Visual Studio 2022 17.0 LTSC 频道的企业版和专业版订阅者应采用最新的当前频道版本或 LTSC 频道。

阅读有关 Visual Studio 2022 版本和支持日期的信息。

了解有关 Visual Studio 产品生命周期和维护的信息。

访问 Visual Studio 网站可访问最新版本的 Visual Studio 2022 产品的链接。 有关如何安装和更新 Visual Studio 2022 的说明,请参阅将 Visual Studio 2022 更新到最新版本Visual Studio 管理员指南包含有关如何在整个组织中部署 Visual Studio 的指南。

Visual Studio 2022 版本 17.0 发行

Visual Studio 2022 博客

可从 Visual Studio 2022 博客获取来自 Visual Studio 工程团队的官方产品见解。 有关 Visual Studio 2022 版的详细信息,可参阅以下文章:


17.0.23 Visual Studio 2022 版本 17.0.23

发布时间:2023 年 7 月 11 日

此次发布的 17.0.23 中已解决的问题

  • Microsoft 注意到了一个漏洞:SmtpClient 类中可能发生 SMTP 地址注入。 这对应于 CVE-2022-26893(不是发布的 CVE,因为该漏洞被评估为“中等”)。

已解决的安全公告


17.0.22 Visual Studio 2022 版本 17.0.22

发布日期:2023 年 6 月 13 日

此次发布的 17.0.22 中已解决的问题

  • Microsoft 注意到了一个漏洞:SmtpClient 类中可能发生 SMTP 地址注入。 这对应于 CVE-2022-26893(不是发布的 CVE,因为该漏洞被评估为“中等”)。

已解决的安全公告


17.0.21 Visual Studio 2022 版本 17.0.21

发布日期:2023 年 4 月 11 日

此次发布的 17.0.21 中已解决的问题

  • 修复当无效输入发送到在内核模式驱动程序的 PGO 训练期间使用的驱动程序时发生故障的问题。
  • 修复了 IIS Express 更新遥测数据时可能导致故障的问题。
  • Microsoft 注意到了一个漏洞:SmtpClient 类中可能发生 SMTP 地址注入。 这对应于 CVE-2022-26893(不是发布的 CVE,因为该漏洞被评估为“中等”)。

开发人员社区

已解决的安全公告


17.0.20 Visual Studio 2022 版本 17.0.20

发布日期:2023 年 3 月 14 日

此次发布的 17.0.20 中已解决的问题

  • Microsoft 注意到了一个漏洞:SmtpClient 类中可能发生 SMTP 地址注入。 这对应于 CVE-2022-26893(不是发布的 CVE,因为该漏洞被评估为“中等”)。
  • Git 2.39 已将 credential.helper 的值从“manager-core”重命名为“manager”。 有关详细信息,请参阅https://aka.ms/gcm/rename
  • 将适用于 Windows 的 mingit 和 Git 包更新至 v2.39.2,这解决了 CVE-2023-22490

已解决的安全公告


17.0.19 Visual Studio 2022 版本 17.0.19

发布日期:2023 年 2 月 14 日

此次发布的 17.0.19 中已解决的问题

  • 已将 CPython 解释器更新至版本 3.9.13。
  • 已将适用于 Windows 的 mingit 和 Git 包更新至 v2.39.1.1,这解决了 CVE-2022-41903

已解决的安全公告

17.0.18 Visual Studio 2022 版本 17.0.18

发布日期:2023 年 1 月 10 日

已解决的安全公告

  • CVE-2023-21538 .NET 拒绝服务漏洞 .NET 6.0 中存在拒绝服务漏洞,其中恶意客户端可能会导致堆栈溢出,这可能会在攻击者向公开的终结点发送无效请求时导致拒绝服务攻击。

17.0.17 Visual Studio 2022 版本 17.0.17

发布时间:2022 年 12 月 13 日

已解决的安全公告

  • CVE-2022-41089 远程代码执行 .NET Core 3.1、.NET 6.0 和 .NET 7.0 中存在远程代码执行漏洞,恶意执行组件可能会导致用户因分析恶意制作的 xps 文件而运行任意代码。

17.0.16 Visual Studio 2022 版本 17.0.16

发布时间:2022 年 11 月 8 日

此次发布的 17.0.16 中已解决的问题

已解决的安全公告


17.0.15 Visual Studio 2022 版本 17.0.15

发布日期:2022 年 10 月 11 日

此次发布的 17.0.15 中已解决的问题

  • 管理员将能够从布局更新脱机客户端计算机上的 VS Installer,而无需更新 VS。

已解决的安全公告

  • CVE-2022-41032 .NET 特权提升漏洞 .NET 7.0.0-rc.1、.NET 6.0、.NET Core 3.1 和 NuGet 客户端(NuGet.exe、NuGet.Commands、NuGet.CommandLine、NuGet.Protocol)存在漏洞,恶意执行组件可能导致用户执行任意代码。

17.0.14 Visual Studio 2022 版本 17.0.14

发布日期:2022 年 9 月 13 日

此次发布的 17.0.14 中已解决的问题

已解决的安全公告

CVE-2022-38013 .NET 拒绝服务漏洞 ASP.NET Core 3.1 和 .NET 6.0 中存在拒绝服务漏洞,其中恶意客户端可能会导致堆栈溢出,这可能会在攻击者发送在模型绑定期间分析的自定义有效负载时导致拒绝服务攻击。


17.0.13 Visual Studio 2022 版本 17.0.13

发布日期:2022 年 8 月 9 日

此次发布的 17.0.13 中已解决的问题

  • 解决了 17.1.4 更新后的 Git 错误 - Visual Studio 反馈提供了通过 Visual Studio 将 git 存储库标记为安全的选项。
  • 将 MinGit 更新到版本 2.37.1.1 以解决 CVE - CVE-2022-29187 (mitre.org) 问题,该问题会让用户受到漏洞的危害,即导航到用户拥有的但其他用户可以写入的存储库可能会被利用来运行恶意代码。
  • 将适用于 Windows 的 Git 更新为 v2.37.1.1,用于解决 CVE-2022-31012。

已解决的安全公告


17.0.12 Visual Studio 2022 版本 17.0.12

发布时间:2022 年 7 月 12 日

此次发布的 17.0.12 中已解决的问题

  • 更新了 LibraryManager 以适应 cdnjs API 的更改
  • 修复了文本编辑器在打开文档时为空或在键入时崩溃的 bug。

已解决的安全公告


17.0.11 Visual Studio 2022 版本 17.0.11

发布日期:2022 年 6 月 14 日

此次发布的 17.0.11 中已解决的问题

  • 将并行 Dev 16.11 C++ 工具集更新到版本 14.29.30145.00。 最新版本的 Dev 16.11 C++ 工具集包含重要的 bug 修复,包括修复所有剩余的 C++20 缺陷报告。 有关详细信息,请参阅 16.11.14 发行说明

来自开发者社区

已解决的安全公告


17.0.10 Visual Studio 2022 版本 17.0.10

发布日期:2022 年 5 月 10 日

此次发布的 17.0.10 中已解决的问题

  • 已将 Visual Studio 使用的 Git for Windows 版本以及可安装可选组件更新到 2.36.0.1
  • 修复了 git 集成的问题,其中,如果拉取/同步已分离的分支,则输出窗口不会显示有关如何解决该问题的本地化提示。
  • 修复了一个问题:在 Visual Studio 中打开 Git 存储库时,输出窗口显示“发生了一个或多个错误”,而不是显示失败发生的原因以及如何解决。
  • 更新了 Daytona 中的 webview2 基线

来自开发者社区

已解决的安全公告

[CVE-2022-29117 .NET 拒绝服务漏洞 .NET 6.0、.NET 5.0 和 .NET Core 3.1 中存在漏洞,恶意客户端可以操纵 Cookie 并导致拒绝服务。

CVE-2022-23267 .NET Core 拒绝服务漏洞 .NET 6.0、.NET 5.0 和 .NET Core 3.1 中存在漏洞,恶意客户端可利用通过 HttpClient 分配的过量内存导致拒绝服务。

CVE-2022-29145 .NET 拒绝服务漏洞 .NET 6.0、.NET 5.0 和 .NET Core 3.1 中存在漏洞,恶意客户端可在解析 HTML 表单时导致拒绝服务。

CVE-2022-24513 特权提升漏洞 当 Microsoft Visual Studio 更新程序服务错误分析本地配置数据时,存在潜在的特权提升漏洞。


17.0.9 Visual Studio 2022 版本 17.0.9

发布日期:2022 年 4 月 19 日

此次发布的 17.0.9 中已解决的问题

  • 修复了 17.0.8 的 vctip.exe 回归
  • 修复了阻止某些使用地址擦除器 (ASAN) 构建的应用程序在 Windows 11 中加载的 bug。
  • 修复了另一个 ASAN 问题,在该问题中,具有堆争用的多线程应用程序可能会遇到死锁、错误的“野指针释放”报告或进程退出期间的死锁。
  • 修复了“无法在脱机计算机上安装 Visual Studio 的任何扩展 (vsix)”问题。

17.0.8 Visual Studio 2022 版本 17.0.8

发布日期:2022 年 4 月 12 日

此次发布的 17.0.8 中已解决的问题

来自开发者社区

已解决的安全公告

CVE-2022-24765 特权提升漏洞 Git for Windows 中存在潜在的特权提升漏洞,其中 Git 操作可以在存储库外部运行,同时搜索 Git 目录。 Git for Windows 现已更新为版本 2.35.2.1。

CVE-2022-24767 DLL 劫持漏洞 在 SYSTEM 用户帐户下运行卸载程序时,Git for Windows 安装程序中存在潜在的 DLL 劫持漏洞。 Git for Windows 现已更新为版本 2.35.2.1。

CVE-2022-24513 特权提升漏洞 当 Microsoft Visual Studio 更新程序服务错误分析本地配置数据时,存在潜在的特权提升漏洞。


17.0.7 Visual Studio 2022 版本 17.0.7

发布日期:2022 年 3 月 8 日

此次发布的 17.0.7 中已解决的问题

  • 改进了在高刷新率监视器上的性能。
  • 修复了 Community SKU 用户的 Visual Studio 启动期间挂起的问题。

来自开发者社区

开发者社区提供了 17.0 中可用修复的完整列表

已解决的安全公告

CVE-2020-8927 漏洞 .NET 5.0 和 .NET Core 3.1 中存在远程代码执行漏洞,其中在 1.0.8 之前的 Brotli 库版本中存在缓冲区溢出。

CVE-2022-24464 漏洞 分析某些类型的 http 表单请求时,.NET 6.0、.NET 5.0 和 .NET CORE 3.1 中存在拒绝服务漏洞。

CVE-2022-24512 漏洞 .NET 6.0、.NET 5.0 和 .NET Core 3.1 中存在远程代码执行漏洞,其中堆栈缓冲区溢出发生在 .NET Double Parse 例程中。

CVE-2021-3711 OpenSSL 缓冲区溢出漏洞 OpenSSL 中存在潜在的缓冲区溢出漏洞,Git for Windows 会使用该漏洞。 Git for Windows 现已更新为版本 2.35.1.2,解决了此问题。


17.0.6 Visual Studio 2022 版本 17.0.6

发布时间:2022 年 2 月 8 日

此次发布的 17.0.6 中已解决的问题

  • 更新了 Visual Studio 安装程序以正确记录通道元数据。
  • 在 Visual Studio 安装程序中发布了有关安装或更新的公告。
  • 更新设置对话框中添加了有关 LTSC 通道到期日期的信息。
  • 添加了以编程方式更改更新的源位置的功能,而与实际执行更新无关。 这使 IT 管理员能够以编程方式更改更新通道
  • 更新了 GitHub 添加帐户体验以提高其成功率。

已解决的安全公告

CVE-2022-21986 漏洞 当 Kestrel Web 服务器处理某些 HTTP/2 和 HTTP/3 请求时,.NET 5.0 和 .NET 6.0 中存在拒绝服务漏洞


17.0.5 Visual Studio 2022 版本 17.0.5

发布时间:2022 年 1 月 13 日

此次发布的 17.0.5 中已解决的问题

  • 解决了在使用易失元数据检测二进制文件时 VSInstr 不会退出,从而导致检测分析失败的偶然情况。
  • 修复了在生成 PDB 和二进制文件时 link.exe 偶尔会崩溃或挂起的问题。
  • 修复了 C++ Concurrency::parallel_for_each 中由于整数溢出导致调用进程崩溃的 bug。
  • 修复了在 C++20 和 C++Latest 语言模式下 ATL 的 CString 比较中的 bug。
  • 修复了在使用大量 pogo 探针时在 arm64 和 arm64ec 上执行 PGI-ed 二进制文件期间出现崩溃的问题。
  • 修复了优化非常大型的函数可能会生成错误代码的问题。

17.0.4 Visual Studio 2022 版本 17.0.4

发布时间:2021 年 12 月 16 日

此次发布的 17.0.4 中已解决的问题

  • 添加了 Xcode 13.2 支持。

17.0.3 Visual Studio 2022 版本 17.0.3

发布时间:2021 年 12 月 14 日

此次发布的 17.0.3 中已解决的问题

双向文本控制字符呈现

为了防止潜在的恶意利用导致错误表示代码,Visual Studio 编辑器将不再允许双向文本控制字符来操纵编辑表面上的字符顺序。 一个新选项将使这些双向文本控制字符与占位符一起显示。 双向文本控制字符仍将出现在代码中,因为此行为仅影响代码编辑器中呈现的内容。

VS with bidirectional text control characters replaced with placeholders

此功能在“工具”\“选项”中控制。 在“文本编辑器”\“常规”页面下,存在“显示双向文本控制字符”选项,默认情况下会选中此选项。 选中后,所有双向文本控制字符都将呈现为占位符。 取消选中该选项将还原为先前不呈现这些字符时的行为。

如果 Unicode 字符属于以下任一范围,则将其视为双向文本控制字符:U+061c、U+200e-U+200f、U+202a-U+202e、U+2066-U+2069。

  • 修复了 Web Forms 设计器中出现崩溃的问题
  • 修复了一个问题,即 !important 的 CSS 补全会在 HTML 或 Razor 文件中的错误位置插入文本。
  • 修复了一个回归问题,即 Xamarin.Forms XAML 热重载与共享类似依赖项的库(例如 SignalR)冲突。 无论应用程序中加载了什么内容,Xamarin.Forms XAML 热重载现在都应该能够进行交互操作。
  • 修复了“项目概览”页面、“诊断工具”或“性能探查器”窗口有时为空白的问题。
  • 修复了 razor 文件编辑时的一个问题,即在键入过程中光标有时会跳到其他位置。

来自开发者社区

开发者社区提供了 17.0 中可用修复的完整列表

已解决的安全公告

CVE-2021-43877 .NET 漏洞 ANCM 中存在一个特权提升漏洞,当 .NET Core、.NET 5 和 .NET 6 应用程序托管在 IIS 中时,该漏洞可能会允许提升特权。

CVE-2021-42574 双向文本漏洞 双向文本控制字符可用于使代码在编辑器中的呈现与磁盘上所包含的内容不同。


17.0.2 Visual Studio 2022 版本 17.0.2

发布时间:2021 年 11 月 30 日

此次发布的 17.0.2 中已解决的问题

  • 修复了使用重叠数据进行类似 memmove 的操作时出现的无提示错误 codegen
  • 添加了使用 C++ 模块或标头单元时在输出窗口中显示的消息。 这包含在 IntelliSense 中使用模块或标头单元的当前已知问题。
  • 修复了 CMake 概览页面和 CMakeSettings 编辑器卡在“正在等待 IntelliSense 完成初始化…”的问题
  • 更正了在具有数据成员初始值设定项的类层次结构中涉及的模板化析构函数可能过早实例化的问题(该问题可能会导致有关未定义类型的使用或其他错误的错误诊断)。
  • 将 Python 3.9.7 添加到了 Python 工作负载。 由于安全漏洞,删除了 Python 3.7.8。
  • 修复了查找下一个 (F3) 和查找并选择下一个 (Ctrl+F3) 有时会跳转到文件中的第一个匹配项而不是下一个匹配项的问题。
  • 解决了版本控制用户界面中的日期不符合客户操作系统区域设置的问题。
  • 解决了 Windows 11 客户将 Windows 终端设置为默认而调试器无法正确停止调试控制台应用并阻止未来启动的问题。

来自开发者社区

开发者社区提供了 17.0 中可用修复的完整列表


17.0.1 Visual Studio 2022 版本 17.0.1

发布时间:2021 年 11 月 16 日

此次发布的 17.0.1 中已解决的问题

  • 修复了使用批生成时发生崩溃的问题。
  • 修复了在启用 XAML 热重载的情况下启动 Xamarin.Forms 项目时发生崩溃的问题。

来自开发者社区

开发者社区提供了 17.0 中可用修复的完整列表

17.0.0 Visual Studio 2022 版本 17.0.0

发布时间:2021 年 11 月 8 日

此次发行的 Visual Studio 2022 版本 17.0.0 中的新增功能摘要

64 位

  • devenv.exe 现仅 64 位

Azure 云服务

  • 对于新客户,由于在 Azure 中新的 Azure 云服务(经典)项目已弃用,因此不支持该项目。 建议替换为 Azure 云服务(外延支持)项目。
  • 现有的 Azure 云服务(经典)项目可以打开并且完全受支持。

C++

  • v143 生成工具现可通过 Visual Studio 安装程序以及独立的生成工具来使用。
  • 在调试程序下运行时,在本机 C++ 应用程序中现在可以使用新的热重载体验。 它同时支持 MSBuild 和 CMake 项目。 有关详细信息,请参阅下面的热重载部分
  • 你现在可以在 WSL2 上进行本机生成和调试,而无需建立 SSH 连接。 跨平台的 CMake 项目和基于 MSBuild 的 Linux 项目均受支持。
  • Visual Studio 现在支持在 CMakePresets.json 中使用 buildPresets.targets 选项。 这样用户可以在 CMake 项目中生成目标的子集。
  • CMake 项目中的“项目”菜单已经过简化,显示“删除缓存并重新配置”和“查看缓存”选项。
  • 已更新 CMake 概述页,以支持 CMakePresets.json。
  • 实现了 /scanDependencies 标志,用于为 CMake 项目输出 C++20 模块依赖项,如 P1689r4 中所述。 这是为了支持使用 CMake 生成基于模块的项目而迈出的一步,我们正致力于在更高版本中完成此支持。
  • 现在可以使用 LLDB 从 Visual Studio 调试在远程系统上运行的进程。
  • 我们将 Visual Studio 附带的 CMake 版本升级到了版本 3.21。 有关可用内容的详细信息,请参阅 CMake 3.21 发行说明
  • Visual Studio 附带的 LLVM 工具已升级到 LLVM 12。 有关详细信息,请参阅 LLVM 发行说明
  • MSVC 工具集现在默认为调试记录中的 SHA-256 源哈希。 以前,工具集默认使用 MD5 进行源哈希处理。
  • 使用 C++ 工作负载的游戏开发现在安装了支持 Visual Studio 2022 的最新 Unreal Engine。
  • 改进了 C++ IntelliSense,为导入的模块和标头单元中的类型提供了导航和语法突出显示功能。
  • 通过优化缓存标头使用情况和对符号数据库的访问,以及通过提升进入代码的访问速度,改进了 C++ IntelliSense 的性能。
  • IntelliSense Code Linter for C++ 现在默认为启用状态,提供对常见代码缺陷的即时建议和修复建议。
  • 支持开关 -fsanitize=fuzzer 下的 libfuzzer。 有关更多详细信息,请参阅文档
  • 我们改进了代码分析工具中的空指针取消引用检测。
  • 代码分析现在强制检查用 _Check_return__Must_inspect_result_ 批注的函数的返回值。
  • 添加了对 gsl::not_null 的支持以进行代码分析。
  • 已更新到 C++ 移动开发工作负载中的 NDK r21 LTS。
  • C++ AMP 标头现已弃用。 在 C++ 项目中包含 <amp.h> 将产生生成错误。 若要禁止提示错误,请定义 _SILENCE_AMP_DEPRECATION_WARNINGS。 有关更多详细信息,请参阅 AMP 弃用链接

调试和诊断

  • “附加到进程”对话框改进
  • 异常帮助程序改进
  • 强制运行到单击处
  • 内存转储诊断分析
  • 我们发布了一种称为“依赖断点”的新型断点,可用于将某个断点配置为仅在首次命中另一个断点时启用。
  • 我们已向“外部源”节点添加了更多更新,你现在可以在子节点“无源模块”下看到模块,并从解决方案资源管理器本身加载符号。
  • 断点槽改进
  • 临时断点
  • 拖放断点
  • 解决方案资源管理器中的外部源节点
  • “附加到进程”对话框改进

个性化

  • 为垂直和水平选项卡添加了为选项卡着色功能
  • 添加了主题包并与 VS Code 主题作者合作推出自定义主题集合
  • 内置主题转换器以将 VS Code 主题转换为在 Visual Studio 2022 中有效
  • 添加了将 Visual Studio 主题与 Windows 主题同步的功能
  • 添加了新的文档管理功能,包括自定义选项卡宽度、加粗活动文档和 docwell 中的额外关闭按钮。

编辑器

  • 添加了子词导航
  • 自动保存现已作为预览功能提供
  • 多插入点复制/粘贴体验

扩展性

  • 从 Microsoft.VisualStudio.Language.Client 程序集中删除了 API
  • VS SDK 包含多个中断性变更,Visual Studio 2019 扩展将不在 2022 中运作。 有关详细信息,请参阅 VSSDK 文档
  • VS SDK 引用程序集不再安装到 VSSDK\VisualStudioIntegration\Common\Assemblies 文件夹中。 如果生成依赖于这些程序集,请迁移你的项目以改用 NuGet 包。 对于脱机情况:
    1. 保留用于还原 nuget 包的组织中的 nuget 源。
    2. 签入二进制文件。
  • 添加了 ILanguageClient 中断性变更修补程序

云服务

  • Azurite 将用于 Azure 存储的本地仿真,而不是旧的且不再积极开发的 Azure 存储仿真器。

Git 工具

帮助菜单

  • 在 17.0 中,我们根据入门材料和有用的提示/技巧重新设计了“帮助”菜单。
  • 它还通过添加一些功能(如访问开发者社区、发行说明、Visual Studio 产品路线图和社交媒体页面)来与开发团队进行更多的协作。

热重载体验

  • .NET 开发人员现在可通过 Visual Studio 调试器使用热重载功能,而无需适用于许多 .NET 6 应用程序类型的调试器
  • C++ 开发人员可以通过 Visual Studio 调试器使用热重载功能

有关更多详细信息,请参阅上面的链接

IntelliCode

JavaScript/TypeScript

  • 我们发布了一个新的 JavaScript/TypeScript 项目类型,该类型使用附加工具生成独立的 JavaScript/TypeScript 项目。 你将能够使用计算机上安装的框架版本在 Visual Studio 中创建 Angular 和 React 项目。
  • JavaScript 和 TypeScript 测试现已在 Visual Studio 测试资源管理器中提供
  • 可使用 NPM GUI,因此现在可以按照下载 Nuget 包的相同方式下载 NPM 模块

.NET 6 SDK

  • Visual Studio 2022 中包含 .NET 6 SDK

.NET 效率

  • 引入参数重构可将新参数从方法实现移动到其调用方。
  • 用于数据流分析的“跟踪值源”
  • 用于为重新分配的变量添加下划线的选项
  • 在“生成重写”对话框中添加了搜索选项
  • XML <code> 标记的快速信息现在保留空格和 CDATA 块
  • “查找所有引用”窗口现在将对多目标项目进行分组
  • 用于在 Visual Basic 中移除重复类型的重构
  • 转到“实现”将不再导航到具有同样被重写的抽象声明的成员。
  • 同步命名空间以匹配解决方案资源管理器中的文件夹结构
  • 从解决方案资源管理器配置后台代码分析
  • 新的 .NET 项目现在默认启用可为空引用类型
  • C# 10.0 文件范围的命名空间重构
  • 导航到已取消编译的源现在默认为启用状态
  • 重构为首选 null 检查,而非类型检查
  • XML 注释现在会在方法显式引发异常时自动生成 <exception> 标记
  • “继承边距”现在默认为启用状态

编程语言

  • C#10

Razor (ASP.NET Core) 编辑器

  • 减少了 UI 冻结并提高了解决方案启动时的性能
  • 在某些解决方案中,语义着色速度提升高达 2 倍
  • Razor 文件中的 F7(查看代码)支持
  • Razor 文件中的代码片段支持,现在只需使用一个选项卡(而不是两个)即可完成代码片段会话
  • 当存在嵌套的 HTML 和 Razor 组件时,@code 块中会提供更好的格式设置
  • Razor 文件中的热重载支持
  • 性能改进
  • 格式设置和缩进增强功能
  • 新的 Razor 编辑器颜色
  • TagHelper 现已着色,并具有快速信息分类支持和完成工具提示
  • Razor 构造的尖括号突出显示和导航
  • 注释现在具有自动完成、智能缩进、自动包含注释延续和块注释导航

远程测试

  • 在远程环境(如 Linux 容器、WSL 和通过 SSH 连接)上启用运行测试的非常早的试验性预览。

测试工具支持

  • 在测试资源管理器中显示
  • 从 17.0 开始的新测试平台版本将无法运行一般测试和顺序测试。 这些特定功能仅作为 MSTestv1 早期版本的一部分提供,不包含在 MSTestv2 中。 我们发现这些功能的使用率非常低,而顺序测试现在被认为与最佳测试做法背道而驰。
  • 一些测试体验在 17.0 中将不可用,包括创建新的 TestSettings 文件和 TestSettings 编辑器。 测试运行仍然可以使用 TestSettings 文件,但是 TestSettings 被 RunSettings 替换了,我们鼓励用户迁移改进的性能和功能。 了解详细信息
  • Web 负载测试和编码的 UI 测试支持更新。 编码的 UI 测试和 [Web 负载测试](基于云的负载测试服务生命周期结束 | Azure DevOps 博客 (microsoft.com))已于 2019 年正式弃用。 为了尽量减少对用户的影响,Visual Studio 2022 中对这些功能提供了最低支持。 强烈建议用户停止编码的 UI 测试和 Web 负载测试。

UWP 扩展 SDK 的工具箱填充

  • UWP 扩展 SDK 现在需要显式声明要在工具箱中显示的类型,方法是在其 SdkManifest.xml 文件中列出这些类型。 早期版本的 Visual Studio 行为不变。它们将忽略清单中的控件列表,并动态枚举 SDK 程序集中的控件类型。

受信任的位置

  • 我们改进了“信任设置”功能,现在,每当用户要在 IDE 中打开不受信任的代码(例如文件、项目或文件夹)时,可以显示警告。
  • 现在,可在解决方案文件夹级别完成信任检查
  • 用户创建的项目会自动添加到受信任列表中
  • 用户可以跳过对由 Visual Studio 创建的临时位置的信任检查

更新、LTSC 和部署

用户界面

  • 已更新并刷新默认图标。

Web 工具

  • 现在,“发布摘要”页在“托管”部分右上角的“…”菜单下提供启动/停止远程调试和分析的操作
  • “连接的服务”页现在包含一个启动存储资源管理器的操作
  • .NET 6 随附的“ASP.NET Core Empty”模板正在使用我们已开始为其添加支持的新的“最小 API”范例
  • Azurite 将用于 Azure 存储的本地仿真,而不是旧的且不再积极开发的 Azure 存储仿真器。
  • 可以通过 Visual Studio 中的连接服务体验,使用 Microsoft 标识平台向 ASP.NET Core 应用程序添加身份验证。

.NET Framework 的 WPF XAML 设计器

  • 将当前面向 .NET Framework 的 WPF XAML 设计器替换为面向 .NET Framework 的新版 WPF XAML 设计器,它以用于面向 .NET (.NET Core) 的 WPF XAML 设计器的相同体系结构为基础。 Visual Studio 的体验看起来是一样的,但是第三方控件供应商需要支持新的可扩展性模型,因为基于 .design.dllMicrosoft.Windows.Design.Extensibility 的上一个模型已启用。 如果已为 .NET (.NET Core) 创建了一个 .designtools.dll 扩展,则同样的扩展也适用于面向 .NET Framework 的新版 WPF XAML 设计器。 请参阅下面的迁移文档,以获取有关如何迁移到新的扩展性模型的详细信息。

XAML 热重载

  • XAML 热重载更改 - 对应用内工具栏和设置进行很小的更改

XAML 实时预览

  • 在 Android Emulator 中运行应用或将应用作为 UWP 桌面应用运行的 WPF、UWP、WinUI 和 Xamarin.Forms 开发人员现在可以使用 XAML 实施预览功能。 实时预览捕获正在运行的应用程序用户界面,并将其引入 Visual Studio 中的停靠窗口。 这样可以更轻松地使用 XAML 热重载更改应用,同时在 Visual Studio 内部查看这些更改,而无需在进行实时 XAML 代码更改时在正在运行的应用与 Visual Studio 之间来回切换。

有关更多信息,请单击下面的链接。

XAML 示例数据

  • 现在使用 WPF 应用程序中的工具箱创建 DataGrid、ListBox 和 ListView 控件时,默认将添加设计时示例数据。 要禁用此行为,请取消选中“工具”->“选项”->“XAML 设计器”下的“创建元素时自动添加示例数据。”
  • 若要详细了解示例数据,请访问示例数据文档

改进了 XAML 绑定体验

  • 我们进行了大量改进以使数据绑定变得快速而简单,例如从属性检查器快速访问“数据绑定”对话框、能够从“快速操作”设置绑定、能够在“数据绑定”对话框中选择要绑定到的属性。

有关更多信息,请单击下面的链接。

已知问题

使用 .NET 的移动开发

Python 工具

C++ IntelliSense

此次发布的 Visual Studio 2022 版本 17.0.0 中的新增功能的详细信息

调试和诊断

  • “附加到进程”对话框改进
  • 通过窗口底部的切换开关新建父/子进程列表视图
    • 应保留所选视图。
    • 键盘中的左按键在父/子视图中导航到父进程。
    • 所有列都应像原始视图一样可以排序。
  • 两个视图中都提供了新的“命令行”列。
  • 应用池名称显示在 w3wp 进程的“标题列”中

![附加到进程 ](media/17.0/17.0_P2_attach_to _process_3.png)

  • 在 catch 块中添加了一个异常帮助程序。 当托管步骤导致引发异常,并且在 catch 块中完成该步骤时,这将显示异常帮助程序以及相关的异常信息。
  • 新的“继续”按钮:显示“已捕获”异常的异常帮助程序。

Exception Handler Updates

  • 我们添加了一个“强制运行到单击处”选项,该选项将运行调试程序,直到达到所选光标位置,同时忽略中间的所有断点。
  • 执行时,单击所需代码行上右键单击菜单中的“强制运行到单击处”。

Force Run to Cursor

  • 当应用程序处于调试模式时,你还可以通过以下方式来执行“强制运行到单击处”:在鼠标悬停时,单击出现在代码行旁边的绿色标志符号,同时按住 SHIFT 键。

Force Run to Cursor Glyph

  • 内存转储诊断分析
    • 我们已经改进了分析器引擎,用于在 ASP.NET Core 内存转储中查找更多基于异步的同步问题。
    • 通过按 CPU 时间查看前 5 个线程,查找代码的哪些部分消耗的 CPU 资源最多。
    • 查看整个托管堆中是否有第 0 代、第 1 代、第 2 代和大型对象堆中的内存压力迹象。
    • 如果有故障转储,可以快速找出导致了应用程序故障的第二个异常和线程。
    • 是否要竭尽全力形成诊断假设? 如果出现故障或挂起的确切原因未知,你可以使用异常分析器快速查找和查看堆上的所有异常。
    • 对于内存分析非常重要的情形,我们改进了终结器队列分析器的启发式方法。 我们现在将重点放在你的代码上,并排除由 .NET Framework 管理的对象。

依赖断点

这是新的断点,允许用户将断点配置为仅在首次命中另一个断点时启用。 调试时,Visual Studio 调试程序仅在命中先决条件断点时在依赖断点处暂停应用程序。 可以通过从设置窗口中启用“仅在命中以下断点时启用”复选框,然后从下拉列表中选择希望基于其配置依赖断点的先决条件断点,将任何断点转换为依赖断点。

Dependent Breakpoint

断点槽改进

我们添加了新的断点标志符号,以指示用户可以设置断点的位置。

Breakpoint Glyph

右键单击该断点标志符号可提供包含选项的新上下文菜单;这样可以快速创建高级断点(条件断点、跟踪和临时断点)。

Breakpoint Context Menu

临时断点

此新断点仅允许用户中断代码一次。 调试时,Visual Studio 调试器针对此断点仅暂停应用程序运行时一次,并在命中该断点之后立即将其删除。 可通过在设置窗口中启用“命中断点后将其删除”复选框,将任何断点转换为临时断点。 也可使用此新设置右键单击断点槽中的上下文菜单来设置此断点。

Temporary Breakpoint

拖放断点

我们为断点添加了拖放手势。 现在可通过按住断点并在所需的代码行上释放,将断点从一个位置移动到另一个位置。 只要上下文中存在操作/条件变量,就可以对高级断点使用拖放操作。

Drag and Drop Breakpoint

解决方案资源管理器中的外部源节点

我们在解决方案资源管理器中添加了一个新的外部源节点。 此节点当前仅在调试时显示,并且将显示加载了包含源服务器或源链接信息符号的托管模块的源。 调试时,任何加载的包含源服务器信息的托管符号文件 (.pdb) 都将显示在此节点下。 可以像任何其他解决方案资源管理器文件夹一样浏览文件,也可以双击某个项,从源服务器下载文件,然后在 VS 编辑器中打开它。 External Sources node in Solution explorer

“附加到进程”对话框改进

我们在“附加到进程”对话框中添加了新的自动刷新复选框,选中该复选框后,会使用可用进程自动刷新进程列表。 使用“附加到进程”对话框中新的“从桌面选择任何窗口”选项,用户可以从桌面选择任何正在运行的窗口,并将其附加到关联的进程进行调试。

Attach to process Dialog Improvements

内存转储诊断分析

发生 Stack Overflow 异常时,查找根调用帧可能比较困难,而且会耗费大量的时间。 我们最新的分析器提供了一个方便的调用堆栈视图,并删除了重复帧和干扰帧,以便更快地进行问题分析。

个性化

将 VS Code 主题转换为 Visual Studio 主题

我们创建了一个主题转换器工具,可以将 VS Code 主题转换为在 Visual Studio 中有效。 在此处试用。

新建 Visual Studio 主题包

默认 VS Code 主题现在可作为 Visual Studio 主题包使用。 请在此处查看主题包。

将主题同步到 Windows OS

我们添加了将 Visual Studio 主题同步到 Windows 主题的功能,以便根据可用的环境光量调整主题。 若要启用此功能,请导航到“工具”>“主题”>“使用系统设置”。

为选项卡着色

若要启用选项卡着色,请导航到“工具”>“选项”>“选项卡和窗口”,然后启用“为选项卡着色”。

Color tabs

编辑器

子词导航

现在可通过子词导航“Ctrl+Alt+向左键”和“Ctrl+Alt+向右键” 。 例如,字符串 HelloWorld 将 Hello 和 World 标识为子词。 启用“工具”>“选项”>“文本编辑器”>“常规”中的“子词导航”将导致与字词相关的命令(例如 TransposeWord)与子词交互。

自动保存

自动保存功能现已在“工具”>“选项”>“环境”>“预览功能”下提供。 如果启用该功能,Visual Studio 应用程序会失去焦点(例如,另一个窗口获得焦点),所有脏文档都将保存到磁盘(如果可能)。 如果无法保存任何文件,它将保持脏状态,直到用户使用“保存”或“另存为...”命令显式保存文件。

多插入点复制/粘贴体验

改进了多插入点复制和粘贴体验。 以前,将多行粘贴到多个插入点时,会在每个插入点复制整个剪贴板。 现在,将多行粘贴到相同数量的插入点时,会将每一行插入相应的插入点。 若要使用多插入点,请按“Alt+Shift+鼠标单击”或“Alt+Shift+.”,并使用“Ctrl+Shift+箭头键”展开选定内容。 接下来,按 Ctrl+C 复制多个选定内容中的文本。 使用 Alt+Shift+鼠标单击为要粘贴到所需位置的每一行创建多个插入点。 最后,按 Ctrl+V 将每行粘贴到其自己的插入点。

Multi-caret copy and paste

此外,可以使用 Alt+Shift+向上键或向下键,或者使用 Alt+Shift+鼠标拖动,来选择多个插入点。 以前,这些操作会创建框选择。 现在,框选择将转换为多个插入点。 与在精确位置单击以插入单独的插入点相比,此方法操作起来更容易且速度更快。 如果希望在展开多插入点选择时将框选择与Alt+Shift+箭头键和 Alt+Shift+鼠标拖动一起使用,请转到“工具”>“选项”>“文本编辑器”>“高级”,然后选择“使用框选择”。

Multi-caret box selection option

扩展性

Microsoft.VisualStudio.LanguageServer.Client 引入了一种新的方式,可以在语言客户端未能初始化时自定义通知。

初始化任务现在由任务状态中心 (TSC) 跟踪。 如果初始化任务失败,用户可以转到 TSC 获取相关问题的详细信息。 语言客户端现在可以自定义向用户显示的消息,可以在消息中提供有关此故障的信息,以及可以采取的修复措施。 为此,我们将在 ILanguageClient 接口中引入一组新的 API。 这些新 API 会导致 ILanguageClient 接口发生中断性变更,因此语言扩展将需要引用新包才能在 Visual Studio 2022 中运行。

以下是新的 API:

  1. ShowNotificationOnInitializeFailed 属性 - 布尔属性,用于确定语言服务器是否希望我们显示气泡来通知用户有关失败的事件,如下所示:

ShowNotificationOnInitializeFailed in the Task Status Center

建议仅在失败显著影响用户对当前正在处理的项目的体验时,才将此属性设置为 true。

  1. OnServerInitializedFailedAsync 方法 - 当语言客户端初始化失败时,将调用此方法。 我们将提供一个 LanguageClientInitializationInfoBase 对象,其中包含有关失败发生方式的信息,以便语言客户端可以按其自己的方式通知用户有关该失败的信息,或者提供包含失败上下文的自定义消息。 如果提供了消息,它将显示在 Visual Studio 的“输出”窗口中。

Language client initialization error in the Output Window

JavaScript/TypeScript

现在支持新的 JavaScript/TypeScript 项目类型,你可使用该类型在 Visual Studio 中创建单独的 Angular、React 和 Vue 项目。 这些项目是使用安装在本地计算机上的框架 cli 工具创建的。 这也意味着模板版本基于本地计算机中的 cli 版本。

在这些新项目中,你将能够运行单元测试并将其与 ASP.NET Core API 项目集成。 可在此处找到相关文档

  • 我们发布了一个新的 JavaScript/TypeScript 项目类型,该类型使用附加工具生成独立的 JavaScript/TypeScript 项目。 在此处阅读详细信息
  • 可使用 NPM GUI,因此现在可以按照在新 JavaScript/TypeScript 项目中下载 Nuget 包的同一方式下载 NPM 模块

NPM GUINPM GUI2

.NET 和 C++ 开发人员的热重载体验

今年早些时候,我们宣布了 .NET 热重载,这是一个充满雄心壮志的项目,旨在为尽可能多的 .NET 开发人员提供热重载体验。 我们最初在 Visual Studio 2019 中提供了第一个预览版本,并承诺在 Visual Studio 2022 中提供更完整的体验。 今天,我很高兴能在此分享我们在 Visual Studio 2022 GA 版本中具体已经完成了哪些部分。

如果你不熟悉热重载,请参阅下面的快速简介。 Visual Studio 中的热重载体验适用于托管 .NET 和原生 C++ 应用。 无论使用哪种类型的应用,热重载的目的都是尽可能减少编辑之间的应用重启次数,从而使你通过减少等待应用重新生成、重启、重新导航到你在应用中的上一个位置等操作的时间来提高工作效率。

为此,可以编辑应用程序的代码文件并将代码更改立即应用于正在运行的应用程序,也称为“热重载”。 应用更改后,通过在应用中执行操作(或通过某种计时器等)再次重新执行代码并立即查看更改;不需要通过断点暂停应用!

若要观看此功能的一些实时演示,可以观看以下视频之一:

Visual Studio 中的热重载用户体验

Visual Studio 2022 中 .NET 和 C++ 开发人员的热重载体验也有了重大改进。 工具栏中现在有“热重载”按钮的目标实现,并且外观有所改进,功能更多。

你首先会注意到带有新图标的新下拉样式按钮。 该命令从早期预览版的“应用代码更改”重命名为“热重载”。

Hot Reload User Experience in Visual Studio 2022

展开按钮可以快速访问功能,例如重启正在运行的应用程序、在保存时选择切换热重载以及快速访问新的设置面板。

每个新功能的更多详细信息如下:

  • 轻松重启应用程序: 现在,如果需要通过重新生成来应用强制编辑,你可以轻松重启正在运行的应用程序,无论是使用调试器启动应用还是不使用调试器启动(.NET 6 应用的新功能!)。
  • 在保存时热重载: 在早期的预览版本中,只能在 ASP.NET 项目中进行保存时应用热重载更改,对于所有其他项目,必须明确单击“热重载”按钮。 在最终版本中,所有项目类型现在都可以使用保存键进行热重载。 此选项是可选的,一旦启用,它将应用于你未来的所有 Visual Studio 会话,除非将其关闭。
  • 轻松访问设置:我们还添加了一个热重载选项面板,以便你在启用/禁用热重载时进行更好的控制。 可以在 Visual Studio 的“选项”>“.NET/C++ 热重载”中或通过在热重载按钮下拉菜单中单击“设置”来访问这些设置。

我们还添加了一个改进的强制编辑对话框,该对话框在不使用调试器的情况下运行 .NET 应用时可用。

New Rude Edit dialog for Hot Reload in Visual Studio 2022

此新对话框有多项改进,例如:

  • Visual Studio 会话范围内的选项,用于在每次进行热重载强制编辑时重新生成和应用更改。 选中后,将应用未来的所有强制编辑,直到重启 Visual Studio
  • 只需单击一下即可完成重新生成和应用代码更改命令,而无需执行多个手动步骤
  • 轻松访问设置

如果不想像以前那样采取任何自动化操作,该对话框还允许继续编辑。

但存在一个已知的限制,当使用调试器时,此新对话框在 GA 版本中将不可用,但未来的更新将完成使此新对话框在这种情况下可用的工作。

对 C++ 应用的支持

使用 Visual Studio 2022 并使用调试器启动应用时,现在可以使用“热重载”按钮热重载在调试器 (F5) 下运行的原生 C++ 应用程序。 使用 CMake 和 OpenFolder 项目生成的应用也支持热重载。

此体验由本机“编辑并继续”提供支持。有关支持的编辑类型,请参阅我们的文档

支持的 .NET 应用框架和方案

自我们于 2021 年 5 月宣布热重载以来,.NET 开发人员经常提到的一个问题是“热重载是否适用于我的 .NET 应用框架/版本组合?”。 我们已经取得了巨大的进步,在大多数情况下,这一问题的答案都是肯定的,要点如下。

  • 使用 Visual Studio 2022 并使用调试器启动应用时,基本的热重载体验适用于大多数类型的 .NET 应用和框架版本,包括 .NET Framework、.NET Core 和 .NET 5+(适用于 C# 和 VB.NET)。 支持的应用类型包括 Web(代码隐藏更改)、桌面、移动、云和其他项目类型。 其关键规则是,如果正在使用调试器,请假设可以使用热重载并尝试使用!
  • 使用 Visual Studio 2022 但不使用调试器(例如使用 Ctrl+F5)启动应用时,如果面向大多数类型的 .NET 6 应用,即使无调试器也可使用热重载。 这意味着不面向 .NET 6(.NET 5 或更低版本)的应用将不支持“无调试器”方案,并且必须使用调试器来获得热重载支持。
  • 将 Visual Studio 2022 与 .NET 6 应用一起使用时,支持大多数类型的方案。 这不限于上述新的“无调试器”功能。 它还包括其他新功能,例如支持热重载 Blazor 项目,更一般地说,在任何 ASP.NET Core 应用中编辑 Razor 文件,以及 CSS 热重载。 将 Visual Studio 2022 与面向 .NET 6 的应用一起使用,可让你获得最强大的热重载体验,快来尝试一下吧!

在以下部分中,我们将对上述摘要进行扩展,并深入了解更多详细信息。

Visual Studio 2022 、.NET 应用与调试器三者结合

使用 Visual Studio 2022 并使用调试器启动应用时,热重载适用于大多数应用框架,包括典型的应用类型,例如控制台、Windows 窗体 (WinForms)、WPF、UWP、WinUI 3* 和大多数类型的 ASP.NET Web 项目(用于代码隐藏编辑),包括 ASP.NET MVC、Web API,甚至较旧的 Web Forms 项目。 此列表也只是一个示例。 真正的答案是,在你拥有 .NET 并使用 Visual Studio 托管调试器的任何地方都应该获得基本的热重载支持。

这意味着,即使是 Azure Functions 之类的项目在此方案中也非常成功。 我们建议你尝试组合,如果发现任何问题,请告知我们。

*WinUI 3 默认使用不支持热重载的混合模式调试。 可以通过启用托管调试器在项目设置中修改它,使热重载正常工作。

Visual Studio 2022 与 .NET 应用结合,但不使用调试器

当面向大多数类型的 .NET 6 应用(包括控制台、WPF、Windows 窗体 (WinForms)、ASP.NET Core MVC、Web API 和 Blazor 等项目类型)时,无需调试器即可使用热重载。 我们知道,一些开发人员有充分的理由或偏好于在没有调试器的情况下启动应用,我们希望此额外功能能给他们带来价值,且不会对启动时间产生影响。

此功能是 .NET 6+ 独有的,不面向 .NET 6(.NET 5 或更低版本)的应用将不支持“无调试器”方案,必须使用调试器才能访问热重载功能。

另请注意,在我们的第一个版本中,并非所有项目类型都支持“无调试器”方案。 具体而言:

  • 没有调试器的热重载不支持 UWP 应用,这是设计使然,目前没有计划改进这一点。
  • 面向 iOS 和 Android 的 Xamarin.Forms 应用不支持 .NET 热重载(无论是在有还是没有调试器的情况下启动应用),但将继续支持 XAML 热重载
  • .NET MAUI 应用在不久的将来将不支持无调试器方案,但将通过调试器支持 .NET 热重载

将 Visual Studio 2022 与 .NET 6 应用一起使用时,支持大多数类型的方案

能够同时使用 Visual Studio 2022 并处理面向 .NET 6 的应用的开发人员将获得最完善和功能最强大的热重载体验的好处。

支持选项的要点:

  • Blazor 应用(服务器和 WebAssembly*)
  • Blazor 和常规 ASP.NET Core 网站中的 Razor 文件编辑
  • CSS 热重载
  • 在没有调试器的情况下运行应用时能够获得热重载支持(如上所述)

面向 .NET 6 的开发人员将继续在未来的 Visual Studio 2022 更新和 .NET 功能带以及主要版本中获得更多改进。 我们才刚刚开始!

*在 Visual Studio 2022 GA 版本中,尚未启用在使用 Visual Studio 调试器时对 Blazor WebAssembly 的热重载支持。 如果在没有调试器的情况下通过 Visual Studio 启动应用,你仍然可以获得热重载,我们正在努力在未来的 Visual Studio 更新中解决这个问题。

支持的 ASP.NET Core 方案

现在,许多 ASP.NET 方案都广泛支持基本的热重载体验。 最广泛可用的功能是能够为大多数类型的 Web 应用程序更改代码隐藏和其他 .NET 类文件。 此功能在使用 Visual Studio 调试器时有效,并且出现在以前可以使用“编辑并继续”的任何位置。

对于面向 .NET 6 的 ASP.NET Core 开发人员,还有一些其他功能不适用于较低版本的 .NET,其中包括以下改进:

  • CSHTML: 编辑 Razor CSHTML 文件现在支持多种类型的编辑。
  • 浏览器刷新:编辑 razor 文件现在将在调试时自动在 Web 浏览器中刷新更改。 以前,这仅在没有调试器的情况下启动应用时才可用。
  • CSS 热重载: 现在可以在应用运行时更改 CSS 文件,键入的更改将立即应用到正在运行的应用。
  • 无调试器: 使用 Visual Studio 在没有调试器的情况下启动 Web 应用 (Ctrl+F5) 时,可以获得热重载支持。

注意:同时使用 Blazor Wasm 应用和 Visual Studio 2022 (17.0) 时,Razor Pages 的热重载目前仅在没有调试器的情况下启动应用时有效。 我们将在将来的更新中添加调试器支持。

支持的 .NET 编辑

.NET 热重载体验由“编辑并继续”机制提供支持,我们进行了改进,以支持超出以前的版本最初可能支持的其他类型的编辑。 改进包括:

  • 添加、更新或删除自定义属性
  • 添加或更新记录结构
  • 添加或更新 #line 指令
  • 编辑 Switch 表达式
  • 用 #line 指令编辑文件,包括对指令本身的更改
  • 编辑顶级语句
  • 编辑使用任何 C# 10 新功能的代码,例如全局 using 指令、文件范围的命名空间、改进的 lambda 和无参数结构构造函数
  • 重命名 Lambda 参数
  • 重命名现有方法的参数

上述改进适用于热重载和“编辑并继续”体验。

其他更新

  • 在多个进程中使用“热重载”和“编辑并继续”: 现在可以在附加到多个进程时可靠地使用“热重载”和“编辑并继续”体验。 以前,此功能并不完全受支持,并且不会始终正常工作,现已得到更正。
  • 更新了错误/警告消息: 我们更新了许多错误/警告消息,使消息应用于 EnC 和热重载时更加清晰。 我们通过使消息更加通用,以便在热重载操作期间不使用“编辑并继续”术语来实现这一点
  • 更快的 .NET 应用单元测试: 热重载技术现在可用作实验性功能,以在面向 .NET 6 时加速单元测试。 有关更多信息,请参阅这些发行说明的测试部分

不支持的 .NET 方案

即使在最终版本中,你仍应注意一些不受支持的方案:

  • Xamarin.Forms 应用在 iOS 和 Android 方案中不支持 .NET 热重载。 面向 UWP 应用时,会获得一些热重载支持。 这是设计使然,我们不希望进行任何进一步的改进。 (注意:在最新的 SDK 上,XAML 热重载将继续可用,并支持 Xamarin.Forms 客户。)
  • 此版本不支持 .NET MAUI 应用,要使用 .NET MAUI 和热重载,请参阅 Visual Studio 2022 更新 1 预览版 1 发行说明了解详细信息。
  • 使用 F# 生成的应用或面向 .NET Native 的应用将不支持热重载。

.NET 效率

解决方案资源管理器中的项目或文件夹(右键单击)菜单中现在提供“同步命名空间”重构,可用于轻松同步命名空间以匹配文件夹结构。

Sync namespaces from Solution Explorer

解决方案资源管理器(右键单击)菜单现在提供后台代码分析配置。 右键单击解决方案资源管理器中的解决方案节点,然后选择“分析和代码清理”。 然后选择“设置分析范围”以配置后台代码分析的范围。

  • 现在添加了一个可以引入参数的重构,该重构通过添加新的参数可以将表达式从方法实现移动到其调用方。 将光标置于包含表达式的行上,或突出显示该表达式。 按 (Ctrl+.) 触发“快速操作和重构”菜单。 为 {0} 选择“引入参数”,或为所有出现的 {0} 选择“引入参数”。 这两个选项都有三个浮出控件选项,分别为:(1) 在所有调用站点插入已更新的表达式,(2) 提取并创建一个可返回表达式并在调用站点添加参数的新方法,或者 (3) 创建一个包含表达式并可调用原始方法的方法重载。

Introduce parameter from Quick Actions menu

  • 有一个名为“跟踪值源”的新命令,可以使用它来执行数据流分析,以确定某些值如何在给定点上传递以及可能传递到的位置。 右键单击任意给定成员,然后从右键单击菜单中选择“跟踪值源”。

Track value source in right click menu

  • 此时将打开“值跟踪”窗口,供你分析结果:

Track Value Source Window

  • 我们添加了一个选项,用来为重新分配的变量添加下划线。 此选项默认关闭,因此需要在“工具”>“选项”>“文本编辑器”>“C#”或“基本”>“高级”中打开它,并选择“为重新分配的变量添加下划线”。

Underline reassigned variables in Editor

  • 我们在“生成重写”对话框中添加了一个搜索选项,使你可以快速搜索和选择要替代的成员。

Search in Generate Overrides Dialog

  • XML <code> 标记的快速信息现在保留空格和 CDATA 块。 将光标悬停在元素上。 然后,快速信息将从代码上方的 XML 注释中显示支持的样式。

Quick Info for XML preserves whitespace

  • “查找所有引用”窗口现在会将多目标项目分组,有助于减少视觉干扰。

Find All Reference Groups Multi-Targeted Projects

  • 现在有一个重构,它删除 Visual Basic 中的重复类型。
  • 转到“实现”将不再导航到具有同样被重写的抽象声明的成员。

C# 语言工具

在 C# 8.0 中,我们引入了可为空引用类型,该类型可用于声明是否需要 null。 若要使用可为空引用类型,需要将 <Nullable>enable</Nullable> 元素添加到项目文件,或将 #nullable enable pragma 添加到项目中的每个源文件中。 为了帮助简化此过程,我们现在将在 .NET 项目中自动包含 <Nullable>enable</Nullable> 元素。

在 C# 10.0 中,我们引入了文件范围的命名空间,让你可以选择不在命名空间中嵌套类定义。 我们现在提供了一个重构,可将命名空间转换为文件范围的命名空间。 若要使用文件范围的命名空间,首先需要将 <LangVersion>preview</LangVersion> 元素添加到项目文件。 接下来,将光标置于命名空间上。 按 (Ctrl+.) 触发“快速操作和重构”菜单 。 选择“转换为文件范围的命名空间”。

File-scoped namespace refactoring

现在,在应用于值类型时,可以选择一种新重构,即首选 is not null 而不是 is object。 若要使用此新重构,请将光标置于类型检查上。 按 (Ctrl+.) 触发“快速操作和重构”菜单 。 选择“首选 null 检查而不是类型检查”。

导航到反编译源

“导航到反编译源”默认为启用状态,使你可以导航到库类型的声明。 对源代码中的库符号和反编译源调用“转到定义”时,可使用“导航到反编译源”。

编辑器的增强功能

XML 注释现在会在 <summary> 标记中自动生成 <exception> 标记,使你可以在方法显式引发异常时添加说明。

在 Visual Studio 2019 中,我们发布了继承边距,可向边距添加新图标,以此表示代码的实现和替代。 单击“继承边距”图标将显示可以选择导航到的继承选项。 在此版本中,继承边距默认为启用。 若要禁用继承边距,请转到“工具”>“选项”>“文本编辑器”>“C#”或“基本”>“高级”,然后取消选择“启用继承边距” 。

Inheritance Margin

编程语言

C# 10

  • 记录结构和结构上的 with 表达式(record struct Point(int X, int Y);var newPoint = point with { X = 100 };)。
  • Global using 指令global using 指令可避免在程序中的许多文件内重复相同的 using 指令。
  • 改进的明确赋值:明确的赋值和为 null 性分析可以更好地处理常见模式,例如 dictionary?.TryGetValue(key, out value) == true
  • 常数内插字符串:由常数组成的内插字符串本身也是常数。
  • 扩展的属性模式:属性模式允许访问嵌套成员 (if (e is MethodCallExpression { Method.Name: "MethodName" }))。
  • 密封记录 ToString:记录可以继承具有密封 ToString 的基础记录。
  • 增量源生成器:通过分解源生成管道和缓存中间结果,改进大型项目中的源生成体验。
  • 混合析构:析构赋值和析构声明可以混合在一起 ((existingLocal, var declaredLocal) = expression)。
  • 方法级 AsyncMethodBuilder:用于编译 async 方法的 AsyncMethodBuilder 可以在本地重写。
  • #line span 指令:允许源生成器(如 Razor)使用指定目标范围的 #line 指令 (#line (startLine, startChar) - (endLine, endChar) charOffset "fileName") 对行映射进行精细控制。
  • Lambda 改进:允许对 lambda 使用属性和返回类型;lambda 和方法组具有自然委托类型 (var f = short () => 1;)。
  • 内插字符串处理程序:使用内插字符串处理程序类型,可在赋值和调用中高效设置内插字符串的格式。
  • 文件范围的命名空间:具有单个命名空间的文件不需要额外的大括号或缩进 (namespace X.Y.Z;)。
  • 无参数结构构造函数:支持结构类型的无参数构造函数和实例字段初始化表达式。
  • CallerArgumentExpression:使用此属性可捕获作为字符串传递给方法的表达式。

有关更多详细信息,请参阅 C# 语言功能状态重大更改

Razor (ASP.NET Core) 编辑器

  • Razor 文件中现在支持热重载。

Reload Support in Razor Files

  • 我们对 Razor 编辑器的性能进行了重大的改进。

  • 加强了格式和缩进,使其更可靠、速度明显加快。

  • 我们添加了新的 Razor 颜色! 你可以在“工具”>“选项”>“环境”>“字体和颜色”中自定义这些颜色。

  • TagHelper 现已着色,并在“快速信息”中提供分类支持,还提供 IntelliSense 完成工具提示。

TagHelpers Classification Support

  • 我们增强了 Razor 构造的尖括号突出显示和导航功能。

  • 注释现在具有自动完成、智能缩进、自动包含注释延续和块注释导航。

远程测试早期试验性预览

我们在远程环境(如 Linux 容器、WSL 和通过 SSH 连接)上启用运行测试的非常早的试验性预览! 虽然这是一个非常有价值的功能,但我们请你耐心等待,因为在我们收集反馈时,此功能仍处于非常早的试验状态。 你可能不会体验到你通常所获得的流畅性,因为你可想象到我们从 Visual Studio 通信和管理已连接环境有很多不同的场景。 下面是使用此试验版远程测试的一些要求:

  • 你需要在目标环境中安装所需的依赖项。 这意味着,如果你希望测试面向在 Linux 容器中运行的 .NET 3.1,则需要确保容器已通过 Dockerfile 安装了 .NET 3.1。 在将来,我们希望创建一种安装体验,使你能够顺利地获取任何测试依赖项,但现在我们会将环境的大部分预配留给用户的规范。
  • 通过“输出”->“测试”窗格规划监视到远程环境的连接状态。 例如,如果已停止容器,“输出”>“测试”窗格中会显示一条消息。 我们可能不会检测到所有的情况,因此,如果看起来像丢失了连接,请计划检查你的输出。 特别是在“输出”窗格没有设置为“测试”的情况下,你可能不会立即看到消息。 我们仍在试验连接丢失时的最佳通知模式,因此,非常欢迎提供反馈! 如果确实出现了连接丢失,你可以使用“测试资源管理器”中的远程测试环境下拉菜单,将连接设置回本地环境,然后再次选择远程环境,重新启动连接。
  • 试验性预览目前只适用于 .NET 测试。 我们了解到用户对支持 C++ 远程测试体验的兴趣,并希望最终也能提供。

如何试用远程测试?

  • 正式的文档将在试验阶段之后发布。 现在,可以开始对其进行测试。
  • 在解决方案的根目录中使用 testenvironments.json 指定环境。 JSON 文件结构遵循以下架构:
{
    "version": "1", // value must be 1
    "environments": [
        { "name": "<unique name>", ... },
        ...
    ]
}
  • 本地容器连接
    • 若要连接到本地运行的容器,必须在本地计算机上安装 Docker 桌面。 还可以选择启用 WSL2 集成,以获得更好的性能。
    • 对于 Dockerfile,可以在解决方案的根目录中使用 testEnvironments.json 指定环境:
          {
          "name": "<name>",
          "localRoot": "<path to local environment>", // optional
          "type": "docker",
          "dockerImage": "<docker image tag>",
          }
      
      例如:
      {
      "version": "1",
      "environments": [
          {
          "name": "linux dotnet-core-sdk-3.1",
          "type": "docker",
          "dockerImage": "testenv"
          }
      ]
      }
      
    • 下面是用于运行面向 .NET 3.1 运行测试的 Dockerfile 示例。
      FROM mcr.microsoft.com/dotnet/core/sdk:3.1
      
    • 使用以下命令生成容器(在末尾加上“.”):docker build -t <docker image name> -f <path to Dockerfile> .
  • 本地 WSL2 连接
    • 必须在本地计算机上启用 WSL2 集成
    • 可以按照以下架构,在解决方案的根目录中使用 testEnvironments.json 指定环境:
      {
      "version": "1",
      "environments": [
          {
          "name": "WSL-Ubuntu",
          "type": "wsl",
          "wslDistribution": "Ubuntu"
          }
      ]
      }
      
  • SSH 连接
    • 转到“工具”>“选项”>“跨平台”>“连接管理器”,以添加或删除 SSH 连接。 选择“添加”将可以输入所需的主机名、端口和任何凭据。
    • 按照以下示例,在解决方案的根目录中使用 testEnvironments.json 指定环境:
      {
      "version": "1",
      "environments": [
          {
          "name": "ssh-remote",
          "type": "ssh",
          "remoteUri": "ssh://user@hostname:22"
          }
      ]
      }
      
  • 通过“测试资源管理器”工具栏中的下拉菜单选择处于活动状态的环境。 目前,一次只能有一个测试环境处于活动状态。

Remote testing environment drop down in Test Explorer

  • 选择环境后,将在新环境中发现并运行测试。

Tests are discovered and executed in remote environments

  • 你现在可以在远程环境中运行和调试测试!

    View test results from remote environment in the test explorer

  • 测试资源管理器可能会提示你安装一些缺少的环境必备组件并尝试安装它们,但最终,我们要将远程环境的大部分预配留给用户的规范。

测试资源管理器中的热重载[试验性]: 现在可以尝试新的试验性功能,使用后台的热重载技术加速测试体验。 这意味着,在首次测试运行后,如果仍然需要完整生成,你可以进行细微更改,然后运行测试,所有这些更新都将反映出来,而无需再次执行完整生成。 若要开始使用并了解更多注意事项,请参阅以下详细信息:

Hot reload for the Test Explorer in Visual Studio enables you to run tests without requiring a build between minor edits

  • 此体验仅适用于面向 .NET 6 的项目,并且必须通过访问“工具”>“选项”>“测试”选择加入

Screenshot of Visual Studio showing enable hot reload option in Tools > Options > Test.

  • 启用此选项后,即使编辑器中存在未保存的更改,也将更新测试。 我们不会生成,因此 bin 文件夹中磁盘上的二进制文件已过时。 这意味着,你可能会发现磁盘上的内容与 Visual Studio 中的测试结果不相符。 若要解决这些问题,请在签入之前,确保使用 Ctrl+Shift+B 执行完整生成。 任何显式生成都会将热重载测试结果替换为常规的完整生成测试结果。

  • 热重载无法选取某些类型的编辑,在这些情况下,它会默认回退到执行完整生成的旧行为。 另请注意,系统仅跟踪 Visual Studio 中的更改,而编辑器中的不透明情况(例如更改目标)可能会默认回退到需要完整生成。

  • 对于某些大的改动(例如重命名 1000 多个方法名称),热重载的时间可能比重新生成所用的时间还要长。 在这些情况下,“输出”窗格中会输出一条消息,提示用户执行完整重新生成,而不是等待热重载。

  • 测试资源管理器中的热重载尚不提供堆栈跟踪。 如果需要使用堆栈跟踪,建议执行完整生成。

测试工具

  • 在测试资源管理器中显示 (Ctrl+E、S) :使用“在测试资源管理器中显示”功能,可从编辑器中测试方法中的光标所在位置跳转到测试资源管理器中测试所在的位置。 这可能会让你想起名为“与活动文档同步”的类似功能,该功能会在解决方案资源管理器中突出显示当前正在处理的文档。 这是开发者社区得票最多的项目之一,感谢所有投票并帮助我们确定优先支持此功能的人员! 也可以从编辑器右键单击菜单、CodeLens 测试字形和解决方案资源管理器右键单击菜单访问“在测试资源管理器中显示”。

    Show in Test Explorer from right-click menuShow in Test Explorer from CodeLens

  • Web 负载测试和编码的 UI 测试支持更新:Visual Studio 2022 中提供了 Web 负载测试记录器。 Visual Studio 2022 中不包含编码的 UI 测试记录器。 你仍然能够通过在 Visual Studio 2022 中编写代码来运行编码的 UI 测试和创建新测试,但记录器依赖于无法移植的 32 位依赖项。 仍可以并行安装 Visual Studio 2019,以使用编码的 UI 记录器。 提醒一下,Web 负载测试和编码的 UI 测试已于 2019 年弃用,我们计划在尽量减小其对用户的影响的情况下将其从产品中删除。 我们强烈建议对 Web UI 测试感兴趣的用户采用新的跨平台和开源 Web 测试框架 Playwright。 Playwright 支持所有主要浏览器,可更好地处理异步代码,并且还内置了测试录制功能。

受信任的位置

  • 作为“信任设置”改进的一部分,我们删除了“Web 标记”复选框,并添加了一个警告对话框,在尝试打开之前不受信任的代码(例如文件、项目或文件夹)时会显示该对话框
  • 现在,可以在当前文件夹或父文件夹位置信任代码
  • 用户创建的项目会自动添加到用户的信任位置列表中
  • 可以跳过对 Visual Studio 功能创建的临时位置的信任检查

在 IDE 中打开内容(例如解决方案、项目、文件或文件夹)之前,我们将验证文件夹位置以前是否受信任。

如果检测到不受信任的代码,我们将显示一个警告对话框,提醒你注意安全隐患,并要求你在执行正常 IDE 操作之前信任该代码。

注意:虽然此功能当前默认关闭,但可以通过“选项”>“信任设置”>“打开内容前要求信任决定”启用

外部源节点更新

解决方案资源管理器中的外部源节点现在还支持 C++。 此外,我们添加了一个新的子节点,该子节点提供所有尚未加载符号的模块。

External Sources node in Solution explorer supports C++

还可使用右键单击上下文菜单直接从解决方案资源管理器加载符号,以便模块可以出现在外部源节点中。 外部源节点中的文件现在也按字母顺序排序。

External Sources menu

已更新并已刷新图标

  • 作为我们用于刷新 Visual Studio 2022 的用户界面的目标的一部分,你会发现整个 IDE 中基于一致性、易读性和熟悉性的新刷新和更新的图标。

Examples of new icons with dark and light backgrounds

XAML 热重载

我们更新了 XAML 热重载设置和应用内工具栏,以明确表示这些设置和应用内体验与 XAML 热重载相关,而与 .NET 热重载不相关。

Updated in-app toolbar in XAML apps

我们还简化了设置窗格,以便更好地将常用选项整理到一处。

Updated XAML Settings options panel

XAML 实时预览

在 Android Emulator 中运行应用或将应用作为 UWP 桌面应用运行的 WPF、UWP、WinUI 和 Xamarin.Forms 开发人员现在可以使用 XAML 实施预览功能。 实时预览捕获正在运行的应用程序用户界面,并将其引入 Visual Studio 中的停靠窗口。 这样可以更轻松地使用 XAML 热重载更改应用,同时在 Visual Studio 内部查看这些更改,而无需在进行实时 XAML 代码更改时在正在运行的应用与 Visual Studio 之间来回切换。

Live Preview of XAML Desktop Apps UI

开始操作:

  • 使用调试器启动受支持的应用程序
  • 打开 XAML 实时预览,通过键入“XAML 实时预览”进行快速搜索或使用应用内工具栏中的“在 XAML 实时预览中显示”按钮

启动体验后,将提供以下功能:

  • 滚动和缩放:你可以平移和缩放用来捕获应用 UI 的窗口,使其满足你的需要,以显示完整的应用或只显示你要编辑的部分。 平移和滚动操作适用于触摸板(两个手指滚动)、鼠标滚轮或按住 CTRL 键的同时单击以拖动内容。
  • 标尺:你可以添加一个或多个水平/垂直标尺来覆盖正在运行的应用。 然后,可以使用鼠标或键盘将这些线条移到位置中。 使用键盘移动标尺时,使用箭头键精确定位,使用 Ctrl + 箭头键进行快速定位。 你还可以通过选择(单击)标尺并按 Delete 键来删除标尺。
  • 元素选择和信息提示:使用元素选择,可以使用与“实时可视化树”或应用内工具栏中的相同功能来选择你要编辑的 XAML 元素。 选择后,还可以启用新的“信息提示”功能,以获取有关所选元素的其他信息,如字体、颜色、边距/填充信息等。 使用“元素选择”时,请考虑启用“预览所选项”:通过“实时可视化树”工具栏按钮,或“调试”>“选项”>“热重载设置”转到源 XAML。
  • 窗口切换:可以控制捕获的应用窗口。

改进了 XAML 绑定体验

  • 改进了属性检查器中的数据绑定图标。 现在,你可以通过单击属性旁边的“圆柱”图标快速访问“数据绑定”对话框,可以通过单击“x”图标清除绑定。

Binding icons in Property Inspector

  • 在快速操作中添加了“绑定”选项卡,现在只需在 XAML 设计器中单击几下即可创建绑定。

Binding tab in Quick Actions

  • 向“数据绑定”对话框添加了“目标属性”组合框,以便随时选择属性。

Updated Data Binding Dialog with Target Property combo box

开发者社区中投票最多的问题

请参阅此版本中的开发者社区修补程序完整列表


已知问题

通过以下链接查看 Visual Studio 2022 中所有待解决问题和可用暂避方法。

反馈和建议

我们期待你的宝贵意见和建议! 可使用安装程序或 Visual Studio IDE 右上角的“发送反馈”图标,或者通过“帮助”>“发送反馈”来报告问题或提出功能建议Feedback Icon。 可在 Visual Studio 开发者社区跟踪你的问题,也可在这里添加评论和查找解决方案。 此外,还可通过实时聊天支持获得免费安装帮助。


Blogs

通过参考开发人员工具博客网站中的见解和建议,随时掌握所有新版本的最新最全资讯,并发表有关大量功能的深入分析帖子。


返回页首