【译】在运行时编辑代码的 .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识 ...
随机推荐
- HAProxy之三----keepalived配合脚本对HAProxy、ping网关实现高可用检测
调用脚本参数含义 vrrp_script<SCRIPT_NAME> { #定义一个检测脚本,在global_defs之外配置 script <STRING>|<QUOTE ...
- Linux 如何查看系统负载
Linux 如何查看系统负载 310 博客 / Linux/ 4个月前/ 534 / 0 操作系统的负载状态,反映了应用程序的资源使用情况,从中能找出应用程序优化的瓶颈所在. 系统平均负载, ...
- linux进阶之Tomcat服务篇
一.Tomcat简介 Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选. Tomca ...
- 『政善治』Postman工具 — 14、NewMan工具的使用详解
目录 1.NewMan工具的介绍 2.NewMan的安装 (1)安装 (2)验证NewMan环境: (3)NewMan卸载命令 3.NewMan执行Postman测试集 (1)导出collection ...
- java 集合梳理
使用 processOn 画的java 集合图谱,应付面试应该可以了
- docker私有仓库搭建及使用
1.下载官方镜像 sudo docker pull registry 下载完成后,docker images可以查看到pull下来的镜像registry 2.启动registry容器,用于提供私有 ...
- python 定时任务APScheduler 使用介绍
python 定时任务APScheduler 使用介绍 介绍: APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的 Python 定时任务调度框架. ...
- Oracle的Rman差异增量备份
所谓增量备份,顾名思义即是每次备份操作那些发生了"变化"的数据块.在RMAN增量备份中有两种:Differential(差异备份)和Cumulative(增量备份)方式.由于需求这 ...
- PyTorch 自动微分示例
PyTorch 自动微分示例 autograd 包是 PyTorch 中所有神经网络的核心.首先简要地介绍,然后训练第一个神经网络.autograd 软件包为 Tensors 上的所有算子提供自动微分 ...
- DLPack构建跨框架的深度学习编译器
DLPack构建跨框架的深度学习编译器 Tensorflow,PyTorch和ApacheMxNet等深度学习框架提供了一个功能强大的工具包,可用于快速进行原型设计和部署深度学习模型.易用性通常是以碎 ...