【译】在运行时编辑代码的 .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识 ...
随机推荐
- CentOS 7磁盘寻找不到,卡在sulogin,造成的开机失败问题--Error getting authority...
今天早上使用内网gitlab仓库的时候,发现页面无法打开,ssh也无法连接. 到机房接上显示器,发现如下错误: Error getting authority: Error initializing ...
- linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合:
linux下获取占用CPU资源最多的10个进程,可以使用如下命令组合: ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head linux下获取占用 ...
- Jira&Confluence服务器安装
1.Mysql安装 参考https://confluence.atlassian.com/doc/database-setup-for-mysql-128747.html 创建相应的数据库 CREAT ...
- Java public 和 private 访问修饰符
何为封装 从事面向对象编程的 Java 程序员,不可能不知道封装,它是面向对象编程的精髓,非常重要. 那什么是封装?字面意思就是把摆在外面的东西包起来. 一句话,封装就是对外隐藏内部细节. 那为何要封 ...
- 3.13eval函数
eval 函数 eval() 函数十分强大 -- 将字符串 当成 有效的表达式 来求值 并 返回计算结果 ```python 基本的数学计算 In [1]: eval("1 + 1" ...
- Centos7 搭建prometheus+Grafana监控
https://baijiahao.baidu.com/s?id=1676883786156871051&wfr=spider&for=pc node scrape_configs ...
- 10.12 telnet:远程登录主机
telnet命令 以前是用于登录远程主机,对远程主机进行管理的.但是因为telnet是采用明文传送报文的,其安全性不好,因此现在很多Linux服务器都不开放telnet服务,而是改用更安全的SSH服务 ...
- 【遥感数字图像处理实验】Erdas版详细图文实验教程(8实验全)
@ 目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 遥感数字图像的处理,是对遥感数字图像的计算机处理.与工业和医学数字图像不同,遥感数字图像类型更为多样,内容更为复杂.因此,遥感 ...
- jenkins配置基于角色的项目权限管理设置步骤
jenkins配置基于角色的项目权限管理设置步骤 本文链接:https://blog.csdn.net/russ44/article/details/52276222 由于jenkins默认的权限管理 ...
- nginx 重定向到系统维护页面
上周末兄弟项目准备扩展服务器以便提供更好的服务,兄弟项目有一些功能是实时提供到我这边的,需要我这边暂时把对应系统功能屏蔽,因为使用nginx,所以可以直接配置nginx重定向到固定系统维护页面. ng ...