【译】在运行时编辑代码的 .NET 热重载
今天,我们很高兴向你介绍 Visual Studio 2019 中 16.11(预览版1)中的 .NET 热重载(通过 .NET 6(预览版4)中的 dotnet watch 命令行工具)。在这篇文章的其余部分,我们会介绍什么是 .NET 热重载,您如何开始使用这个特性,我们对未来计划改进的设想,以及目前支持哪种编辑和语言的明确性。
什么是 .NET 热重载
使用热重载,您现在可以在应用程序运行时修改应用程序托管的源代码,而不需要手动暂停或命中断点。只需在应用程序运行时进行受支持的更改,并在我们新的 VisualStudio 体验中使用“apply code changes”按钮应用您的编辑。

热重载支持已经存在的和即将到来的项目类型,例如 WPF、Windows Forms、.NET MAUI 预览版、ASP.NET Core、Console 、WinUI 3 等等。这种支持非常广泛,支持与任何由 .NET Framework 或 CoreCLR 运行时驱动的项目。(This support is very broad with the core experience working with any project that is powered by .NET Framework or CoreCLR runtimes.)
通过热重载,我们的目标是让这种体验可用,无论您喜欢如何启动您的应用程序。通过今天的发布,您现在可以通过完全集成的 Visual Studio 调试器体验或 dotnet watch 命令行工具使用此体验,稍后版本将有更多的选项。
开始
你可以选择使用 Visual Studio 的最新预览版,也可以选择使用 .NET 6 预览4,介绍如下。
Visual Studio
在 Visual Studio 中使用调试器时尝试热重载:
下载并安装 Visual Studio 2019 16.11 预览版1。
打开支持的项目类型,例如 WPF 应用程序。
通过 F5 启动附加调试器的应用程序(确保在调试器配置中“enable native code debugging”为禁用)。
打开一个 C# 代码文件,其中有些代码可以通过正在运行的应用程序的用户界面重新执行(例如:一个按钮的逻辑代码或一个 ViewModel 的 command),或者通过 Timer 间隔触发一些东西,然后更改代码。
使用 Visual Studio 中的工具栏新的“应用代码更改(ALT-F10)按钮”(Continue 按钮旁边)来应用代码更改。请注意,在使用 Visual Studio 时并不需要保存文件,这给了您快速更改代码并继续进行调试的灵活性。
如果您所做的更改得到支持,那么您的应用程序现在将使用新逻辑在运行时进行修补,并且您应该在下一次通过您的操作或类似计时器的触发代码,重新执行更新的代码时看到应用程序行为的更改。
您还可以继续使用其他调试器特性,如断点、编辑并继续、XAML 热重载等。您现在所习惯的一切都应该与 .NET 热重载完全并行。如果有些东西对你不起作用,请让我们知道!
CLI
使用 dotnet watch 从命令行启动应用时使用热重载:
安装 .NET 6 预览4。
更新你的 ASP.NET Core 项目到 .NET 6。
launchSettings.json 中添加 “hotReloadProfile”: “aspnetcore” 属性。
{
"profiles": {
"dotnet": {
"commandName": "Project",
"hotReloadProfile": "aspnetcore"
}
}
}
使用 dotnet watch 运行项目并查看输出,它应该显示启用了热重载。
对您的应用程序托管代码进行热重载支持的代码更改,并保存文件以应用。
就像 Visual Studio 的体验一样,你的新逻辑现在应该被应用了,你应该会在下次更新的代码被重新执行时看到应用程序行为的变化。
您也可以通过这种方式修改“blazorwasm”热重载配置文件,在您的 Blazor WebAssembly 项目中使用上面类似的步骤。你甚至可以在 WindowsForms 或其他由 CoreCLR 支持的项目中尝试它,只需手动在 Properties 文件夹下添加一个带有上面示例内容的名为 launchSettings.json 的文件。
这一功能仍在开发中,我们正在跟踪未来的改进,将更容易使用 dotnet watch 来热重载所有类型的 .NET Core 应用程序,而无需 launchSettings.json 文件,这在当前版本中的还是一个限制。
将在 Visual Studio 2022 和 .NET 6 中的实现最佳
今天的发布只是我们为 .NET 开发人员提供的热重载的预览版。在 .NET 6 预览版和 Visual Studio 2019 中,只有部分功能可用。该特性的全功能会在 .NET 6(和未来版本的 .NET)以及 Visual Studio 2022 中作为框架和工具集提供最完整功能和最佳经验。
为了让你大致了解我们计划在未来的预览版和最终版本中提供哪些特性,这里有一些例子:
.NET Multi-platform App UI (.NET MAUI):借助 .NET 6 Preview 4,开发人员构建 .NET MAUI 应用程序时,现在可以使用 .NET 热重载来实现针对 WinUI 3 的项目。在未来的版本中,我们将在 iOS、Android 和 Mac Catalyst 场景中引入 .NET 热重载支持。
Razor Pages:在未来的版本中,将支持热重载和编辑并继续 (Edit and Continue,EnC),用于为 .NET 6 或更高版本的网站或 Blazor 应用编辑 Razor。
无需调试器:在 Visual Studio 2022 的未来版本中,我们正在努力添加对使用热重载而不需要调试器的支持,这意味着开发者将能够使用 CTRL-F5 启动他们的应用程序,并且仍然使用热重载来修补他们正在运行的应用程序。
减少不受支持的更改:在 Visual Studio 2022 和 .NET 6+ 的未来版本中,我们计划跨多个团队进行工作,以减少运行时不受支持的编辑的数量。
优化框架以更好地支持热重载:在.NET 6 中,我们正在研究如何改进某些框架以更好地支持热重新加载。将包括对 ASP.NET Core, .NET MAUI 和其他框架的调整和优化将使热重载在更多的情况下更有用。
以上是我们目前的计划,请注意,计划可能会根据客户的反馈和时间表进行更改。
支持/不支持的更改和语言
无论你如何使用 .NET 热重载,请注意,有些更改在运行时是不支持的,会提示你一个粗糙的编辑对话框,并要求你重新启动应用程序。我们仍致力于该特性和文档,以详细说明支持哪些编辑。现在,首先查看现有的编辑并继续(EnC)列表等效功能。由于热重载是由 EnC 驱动的,这将为你更好地理解这个新特性提供一个很好的起点。具体请参见:EnC 文档。
此外,虽然上面的例子是特别提到 C# 的,但在 Visual Studio 的调试器下运行时,在各种情况下也支持 Visual Basic。F# 目前在 .NET 6 中还不支持,但我们计划在未来的版本中根据客户的反馈提供支持。
您的反馈很重要
在这个早期的预览版中,我们要承认将会有 bug。有时候,如果你尝试应用一个更改,它可能会悄无声息地失败,或者你的应用可能会崩溃,等等。如果您确实遇到了问题,请花点时间向我们报告问题,因为只有得到您的反馈,我们才能确保关键问题得到解决,并根据您的输入确定未来决策的优先级。
要联系我们,请使用Visual Studio的反馈机制。
原文链接
https://devblogs.microsoft.com/dotnet/introducing-net-hot-reload/

【译】在运行时编辑代码的 .NET 热重载的更多相关文章
- vs2017运行时修改代码Changes are not allowed while code is running.
vs2017代码运行时不允许进行更改 工具->选项->调试->常规->启用编辑并继续不选择“启用编辑并继续”,这样就可以在调试时修改cs代码了.
- 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- Method Swizzling以及AOP编程:在运行时进行代码注入-备用
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- Method Swizzling以及AOP编程:在运行时进行代码注入-b
概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...
- [译]JVM运行时数据区
(本篇文章翻译自JVM Run-Time Data Areas) 这是我阅读JVM规范的笔记,而且我画了一个图来帮助我理解. 1.每一个单独的线程(非共享的)的数据区 针对每一个单独的线程的数据区包括 ...
- C# 运行时编辑 节点重命名
方法一: ; bool nodeChanged = false; //右键点击,就进入修改状态 private void treeView1_NodeMouseClick(object sender, ...
- [译]在运行时内存中的Java对象是怎么样的
(文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...
- ObjC运行时部分概念解析(二)
上篇文章简单的说明了两个关键字究竟是什么,这里主要讲讲ObjC中各种基本内存模型 Method typedef struct objc_method *Method; struct objc_meth ...
- 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)
概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...
随机推荐
- kvm总结复习
一.虚拟化概念 1.虚拟化技术:在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU.内存.磁盘空间.网络适配器等),予以 ...
- k8s滚动更新(8)
一.k8s版本更新 滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 实践:部署 ...
- Linux服务之批量部署篇
批量部署步骤: 1.检查环境 getenforce #检查内核防火墙是否关闭 systemctl status firewalld #检查firewalld是否 ...
- 把采集到的数据发送到一个Google Docs或者Google Form上 这个网站提供了参考和例子
把采集到的数据发送到一个Google Docs或者Google Form上这个网站提供了参考和例子 http://www.instructables.com/id/Post-to-Google-Doc ...
- spark算子优化
一.在聚合前在map端先预聚合 使用reduceByKey/aggregateByKey代替groupByKey 二.一次处理一个分区的数据,不过要注意一个分区里的数据不要太大,不然会报oom * 使 ...
- SpringCloud专题之开篇及Eureka
声明: 本专题部分理论来自翟永超老师的<Spring Cloud微服务实战>.建议大家看原书. 开篇 微服务简单来说是系统架构上的一种设计风格,他的主旨是将一个原本独立且庞大的系统按照不同 ...
- VMware Tanzu Kubernetes Grid 1.3 发布 - VMware 构建、签名和支持的开源 Kubernetes 容器编排平台的完整分发版
Tanzu Kubernetes 集群是由 VMware 构建.签名和支持的开源 Kubernetes 容器编排平台的完整分发版.可以通过使用 Tanzu Kubernetes Grid 服务在主管集 ...
- KVO后[obj class]与object_getClass(id obj)的结果竟会不一致?
说说背景,研究下面的代码时,KVO后[obj class]与object_getClass(id obj)的结果竟会不一致? PersonModel *aPersonModel = [[PersonM ...
- Python-Redis-常用操作&管道
常用操作 1.1 delete(*names) ? 1 2 3 4 5 6 7 8 9 # 根据删除redis中的任意数据类型 print(r.get('name')) r.delete('nam ...
- Jupyter Notebook出现kernel error情况
今天重新装了anaconda,在运行时发现真快,可是在运行selenium的代码时候,发现自己按照以前写得帖子得步骤做,同样还是出现了错误,心里不免大吃一惊,难道我的做法是错的?等到发现有个 ker ...