今天,我们很高兴向你介绍 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 热重载的更多相关文章

  1. vs2017运行时修改代码Changes are not allowed while code is running.

    vs2017代码运行时不允许进行更改 工具->选项->调试->常规->启用编辑并继续不选择“启用编辑并继续”,这样就可以在调试时修改cs代码了.

  2. 【原】iOS动态性(三) Method Swizzling以及AOP编程:在运行时进行代码注入

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  3. Method Swizzling以及AOP编程:在运行时进行代码注入-备用

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  4. Method Swizzling以及AOP编程:在运行时进行代码注入-b

    概述 今天我们主要讨论iOS runtime中的一种黑色技术,称为Method Swizzling.字面上理解Method Swizzling可能比较晦涩难懂,毕竟不是中文,不过你可以理解为“移花接木 ...

  5. [译]JVM运行时数据区

    (本篇文章翻译自JVM Run-Time Data Areas) 这是我阅读JVM规范的笔记,而且我画了一个图来帮助我理解. 1.每一个单独的线程(非共享的)的数据区 针对每一个单独的线程的数据区包括 ...

  6. C# 运行时编辑 节点重命名

    方法一: ; bool nodeChanged = false; //右键点击,就进入修改状态 private void treeView1_NodeMouseClick(object sender, ...

  7. [译]在运行时内存中的Java对象是怎么样的

    (文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java ...

  8. ObjC运行时部分概念解析(二)

    上篇文章简单的说明了两个关键字究竟是什么,这里主要讲讲ObjC中各种基本内存模型 Method typedef struct objc_method *Method; struct objc_meth ...

  9. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

随机推荐

  1. Linux_yum工具基本概述

    一.什么是yum 1️⃣:yum是yellowdog update manager的简称,它能够实现rpm管理的所有操作,并能够自动解决各rpm包之间的依赖关系. 2️⃣:yum是rpm的前端工具,是 ...

  2. scala :: , +:, :+ , ::: , ++ 的区别

    4 种操作符的区别和联系 :: 该方法被称为cons,意为构造,向队列的头部追加数据,创造新的列表.用法为 x::list,其中x为加入到头部的元素,无论x是列表与否,它都只将成为新生成列表的第一个元 ...

  3. MyBatis 动态 SQL 语句中出现 '<' 的问题

    问题描述 映射接口方法如下: /** * 根据姓名和年龄查询用户信息 * @param name 姓名 * @param user 获取年龄 * @return */ public List<U ...

  4. 7.json&pickle及软件目录结构规范

    json(可以序列化简单数据类型,用于不同语言之间的数据交换传输)import jsonjson.dumps() 写入json.loads() 读取json.dump(info,f) == f.wri ...

  5. Centos下删除文件后空间并未释放

    [root@DeviceSP /]# df -h Filesystem Size Used Avail Use% Mounted on /dev/vda3 90G 82G 3.8G 96% / tmp ...

  6. 并发王者课-青铜5:一探究竟-如何从synchronized理解Java对象头中的锁

    在前面的文章<青铜4:synchronized用法初体验>中,我们已经提到锁的概念,并指出synchronized是锁机制的一种实现.可是,这么说未免太过抽象,你可能无法直观地理解锁究竟是 ...

  7. 在Spring Bean实例过程中,如何使用反射和递归处理的Bean属性填充?

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! <Spring 手撸专栏>目录 [x] 第 1 章:开篇介绍,我要带你撸 Spri ...

  8. descriptor 'decode' requires a 'bytes' object but received a 'NoneType'

    记录在使用python过程中踩的坑------ 使用xlwt库对excel文件进行保存时报错 descriptor 'decode' requires a 'bytes' object but rec ...

  9. ARM NEON指令集优化理论与实践

    ARM NEON指令集优化理论与实践 一.简介 NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bi ...

  10. MindSpore应用目标

    MindSpore应用目标 以下将展示MindSpore近一年的高阶计划,会根据用户的反馈诉求,持续调整计划的优先级. 总体而言,会努力在以下几个方面不断改进. 1. 提供更多的预置模型支持. 2. ...