.NET 6 攻略大全(一)

点击上方蓝字

关注我们

(本文阅读时间:15分钟)

欢迎使用 .NET 6。今天的版本是.NET 团队和社区一年多努力的结果。C# 10 和 F# 6 提供了语言改进,使您的代码更简单、更好、性能大幅提升,我们已经看到微软降低了托管云服务的成本。.NET 6 是第一个原生支持 Apple Silicon (Arm64) 的版本,并且还针对 Windows Arm64 进行了改进。我们构建了一个新的动态配置文件引导优化 (PGO) 系统,该系统可提供仅在运行时才可能进行的深度优化。使用dotnet monitor 和 OpenTelemetry 改进了云诊断。WebAssembly 支持更有能力和性能。为HTTP/3添加了新的 API ,处理 JSON、数学和直接操作内存。.NET 6 将支持三年。开发人员已经开始将应用程序升级到 .NET 6,我们在生产中听到了很好的早期成果。.NET 6 已为您的应用程序做好准备。

您可以下载适用于 Linux、macOS 和 Windows 的.NET 6 。

  • 安装程序和二进制文件

  • 容器图像

  • Linux 软件包

  • 发行说明

  • API 差异

  • 已知的问题

  • GitHub 问题跟踪器

请参阅 ASP.NET Core、Entity Framework、Windows Forms、.NET MAUI、YARP 和 dotnet 监视器帖子,了解各种场景中的新增功能。

  • .NET 6 下载

    https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0

a74106b450f001a1711e9254bc34991b.png

.NET 6 亮点 

e9daa880810a9230b832570d5e7cfad7.png

.NET 6 是

  • 使用 Microsoft 服务、其他公司运行的云应用程序和开源项目进行生产压力测试。

  • 作为最新的长期支持 (LTS) 版本支持三年。

  • 跨浏览器、云、桌面、物联网和移动应用程序的统一平台,所有这些都使用相同的 .NET 库并能够轻松共享代码。

  • 性能得到了极大的提高,尤其是文件 I/O,这共同导致了执行时间、延迟和内存使用的减少。

  • C# 10 提供了语言改进,例如记录结构、隐式使用和新的 lambda 功能,而编译器添加了增量源生成器。F# 6添加了新功能,包括基于任务的异步、管道调试和众多性能改进。

  • Visual Basic 在 Visual Studio 体验和 Windows 窗体项目打开体验方面有所改进。

  • Hot Reload 使您能够跳过重新构建和重新启动您的应用程序以查看新更改(在您的应用程序运行时),Visual Studio 2022 和 .NET CLI 支持 C# 和 Visual Basic。

  • 云诊断已通过 OpenTelemetry 和 dotnet monitor 得到改进,现在在生产中支持并在 Azure 应用服务中可用。

  • JSON API 的功能更强大,并且通过序列化程序的源生成器具有更高的性能。

  • ASP.NET Core 中引入的最小 API 可简化入门体验并提高 HTTP 服务的性能。

  • Blazor 组件现在可以从 JavaScript 呈现并与现有的基于 JavaScript 的应用程序集成。

  • Blazor WebAssembly (Wasm) 应用程序的 WebAssembly AOT编译,以及对运行时重新链接和本机依赖项的支持。

  • 使用 ASP.NET Core 构建的单页应用程序现在使用更灵活的模式,可与 Angular、React 和其他流行的前端 JavaScript 框架一起使用。

  • 添加了 HTTP/3,以便 ASP.NET Core、HttpClient 和 gRPC 都可以与 HTTP/3 客户端和服务器交互。

  • File IO 现在支持符号链接,并且通过 re-written-from-scratch 大大提高了性能FileStream。

  • 通过支持 OpenSSL 3、ChaCha20Poly1305 加密方案和运行时深度防御缓解,特别是 W^X和CET,安全性得到了改进。

  • 可以为 Linux、macOS 和 Windows(以前只有 Linux)发布单文件应用程序(免提取)。

  • IL 修整现在更加强大和有效,新的警告和分析器可确保正确的最终结果。

  • 添加了源生成器和分析器,可帮助您生成更好、更安全和更高性能的代码。

  • 源代码构建使 Red Hat 等组织能够从源代码构建 .NET 并向其用户提供自己的构建。

该版本包括大约一万次 git 提交。即使这篇文章很长,它也跳过了许多改进。您必须下载并试用.NET 6 才能看到所有新功能。

1b744df4c9fe1bee387a360461bc6a57.png

支持

a3b44522ded8d8cb48e681e28a728614.png

.NET 6 是一个长期支持 (LTS) 版本,将支持三年。它支持多种操作系统,包括 macOS Apple Silicon 和 Windows Arm64。

Red Hat 与 .NET 团队合作,在 Red Hat Enterprise Linux 上支持 .NET。在 RHEL 8 及更高版本上,.NET 6 将可用于 AMD 和 Intel (x64_64)、ARM (aarch64) 以及 IBM Z 和 LinuxONE (s390x) 架构。

请开始将您的应用程序迁移到 .NET 6,尤其是 .NET 5 应用程序。我们从早期采用者那里听说,从 .NET Core 3.1 和 .NET 5 升级到 .NET 6 很简单。

Visual Studio 2022 和 Visual Studio 2022 for Mac 支持 .NET 6 。Visual Studio 2019、Visual Studio for Mac 8 或 MSBuild 16 不支持它。如果要使用 .NET 6,则需要升级到Visual Studio 2022(现在也是 64 位)。Visual Studio Code C# 扩展支持 .NET 6 。

Azure App 服务:

  • Azure Functions 现在支持在 .NET 6 中运行无服务器函数。

  • App Service .NET 6 GA Announcement 为 ASP.NET Core 开发人员提供了信息和详细信息,他们很高兴今天开始使用 .NET 6。

  • Azure 静态 Web 应用现在支持带有 Blazor WebAssembly 前端和 Azure Function API 的全栈 .NET 6 应用程序。

注意:如果您的应用已经在应用服务上运行 .NET 6 预览版或 RC 版本,则在将 .NET 6 运行时和 SDK 部署到您所在区域后,它将在第一次重新启动时自动更新。如果您部署了一个独立的应用程序,您将需要重新构建和重新部署。

3dfa52c25fc25ce9076797cd0007d9d2.png

统一扩展平台

074e9b95b2e3e3c89c908f3a0f747cf1.png

.NET 6 为浏览器、云、桌面、物联网和移动应用程序提供了一个统一的平台。底层平台已更新,可满足所有应用类型的需求,并便于在所有应用中重用代码。新功能和改进同时适用于所有应用程序,因此您在云或移动设备上运行的代码的行为方式相同并具有相同的优势。

80cde9f963770dc94c7386b88d1986fe.png

.NET 开发人员的范围随着每个版本的发布而不断扩大。机器学习和 WebAssembly 是最近添加的两个。例如,通过机器学习,您可以编写在流数据中查找异常的应用程序。使用 WebAssembly,您可以在浏览器中托管 .NET 应用程序,就像 HTML 和 JavaScript 一样,或者将它们与 HTML 和 JavaScript 混合使用。

最令人兴奋的新增功能之一是.NET Multi-platform App UI (.NET MAUI)。您现在可以在单个项目中编写代码,从而跨桌面和移动操作系统提供现代客户端应用程序体验。.NET MAUI 将比 .NET 6 稍晚发布。我们在 .NET MAUI 上投入了大量时间和精力,很高兴能够发布它并看到 .NET MAUI 应用程序投入生产。

当然,.NET 应用程序也可以在家中使用 Windows 桌面(使用 Windows Forms 和WPF)以及使用 ASP.NET Core 在云中。它们是我们提供时间最长的应用程序类型,并且仍然非常受欢迎,我们在 .NET 6 中对其进行了改进。

f0cc6ce1f1ae790d28a852a5270ea36e.png

面向.NET 6

130de5c7b1ff42d16fa2402676ffe3ae.png

继续以广泛平台为主题,在所有这些操作系统上编写 .NET 代码很容易。

要以 .NET 6 为目标,您需要使用 .NET 6 目标框架,如下所示:

<TargetFramework>net6.0</TargetFramework>

net6.0 Target Framework Moniker (TFM) 使您可以访问 .NET 提供的所有跨平台 API。如果您正在编写控制台应用程序、ASP.NET Core 应用程序或可重用的跨平台库,这是最佳选择。

如果您针对特定操作系统(例如编写Windows 窗体或 iOS 应用程序),那么还有另一组 TFM(每个都针对不言而喻的操作系统)供您使用。它们使您可以访问所有 net6.0的API以及一堆特定于操作系统的 API。

• net6.0-android

• net6.0-ios

• net6.0-maccatalyst

• net6.0-tvos

• net6.0-windows

每个无版本 TFM 都相当于针对 .NET 6 支持的最低操作系统版本。如果您想要具体或访问更新的 API,可以指定操作系统版本。

net6.0 和 net6.0-windows TFMs 都支持(与 .NET 5 相同)。Android 和 Apple TFM 是 .NET 6 的新功能,目前处于预览阶段。稍后的 .NET 6 更新将支持它们。

操作系统特定的 TFM 之间没有兼容性关系。例如,net6.0-ios 与 net6.0-tvos 不兼容。如果您想共享代码,您需要使用带有 #if 语句的源代码或带有 net6.0 目标代码的二进制文件来实现。

b4f673990b365d01ffc77b646af3e03e.png

性能

b518da30ec62c3d7cf0ec9c0b23e5420.png

自从我们启动 .NET Core 项目以来,该团队一直在不断地关注性能。Stephen Toub 在记录每个版本的 .NET 性能进展方面做得非常出色。欢迎查看在 .NET 6 中的性能改进的帖子。在这篇文章中,里面包括您想了解的重大性能改进,包括文件 IO、接口转换、PGO 和 System.Text.Json。

▌动态 PGO

动态轮廓引导优化 (PGO)可以显着提高稳态性能。例如,PGO 为 TechEmpower JSON“MVC”套件的每秒请求数提高了 26%(510K -> 640K)。

动态 PGO 建立在分层编译的基础上,它使方法能够首先非常快速地编译(称为“第 0 层”)以提高启动性能,然后在启用大量优化的情况下随后重新编译(称为“第 1 层”)一旦该方法被证明是有影响的。该模型使方法能够在第 0 层中进行检测,以允许对代码的执行进行各种观察。在第 1 层重新调整这些方法时,从第 0 层执行收集的信息用于更好地优化第 1 层代码。这就是机制的本质。

动态 PGO 的启动时间将比默认运行时稍慢,因为在第 0 层方法中运行了额外的代码来观察方法行为。

要启用动态 PGO,请在应用程序将运行的环境中设置 DOTNET_TieredPGO=1。您还必须确保启用分层编译(默认情况下)。动态 PGO 是可选的,因为它是一种新的且有影响力的技术。我们希望发布选择加入使用和相关反馈,以确保它经过全面压力测试。我们对分层编译做了同样的事情。至少一个非常大的 Microsoft 服务支持并已在生产中使用动态 PGO。我们鼓励您尝试一下。

您可以在.NET 6中的性能帖子中看到更多关于动态 PGO 优势的信息,包括以下微基准,它测量特定 LINQ 枚举器的成本。

private IEnumerator<long> _source = Enumerable.Range(0, long.MaxValue).GetEnumerator();[Benchmark]
public void MoveNext() => _source.MoveNext();

这是有和没有动态 PGO 的结果。

方法
意思是
代码大小
PGO 已禁用1.905 纳秒30乙
启用 PGO0.7071 纳秒105乙

这是一个相当大的差异,但代码大小也有所增加,这可能会让一些读者感到惊讶。这是由 JIT 生成的汇编代码的大小,而不是内存分配(这是一个更常见的焦点)。.NET 6 性能帖子对此有很好的解释。

PGO 实现中常见的一种优化是“热/冷分离”,其中经常执行的方法部分(“热”)在方法开始时靠近在一起,而不经常执行的方法部分(“冷”)是移到方法的末尾。这样可以更好地使用指令缓存,并最大限度地减少可能未使用的代码负载。

作为上下文,接口调度是 .NET 中最昂贵的调用类型。非虚拟方法调用是最快的,甚至更快的是可以通过内联消除的调用。在这种情况下,动态 PGO 为 MoveNext 提供了两个(替代)调用站点。第一个 - 热的 - 是对 Enumerable+RangeIterator.MoveNext 的直接调用,另一个 - 冷的 - 是通过 IEnumerator<int> 的虚拟接口调用。如果大多数时候最热门的人都被叫到,那将是一个巨大的胜利。

这就是魔法。当 JIT 检测此方法的第 0 层代码时,包括检测此接口调度以跟踪每次调用时 _source 的具体类型。JIT 发现每次调用都在一个名为 Enumerable+RangeIterator 的类型上,这是一个私有类,用于在 Enumerable 实现内部实现 Enumerable.Range。因此,对于第 1 层,JIT 已发出检查以查看 _source 的类型是否为 Enumerable+RangeIterator:如果不是,则跳转到我们之前强调的执行正常接口调度的冷部分。但如果是 - 基于分析数据,预计绝大多数时间都是这种情况 - 然后它可以继续直接调用非虚拟化的 Enumerable+RangeIterator.MoveNext 方法。不仅如此,它还认为内联 MoveNext 方法是有利可图的。最终效果是生成的汇编代码有点大,但针对预期最常见的确切场景进行了优化。当我们开始构建动态 PGO 时,这些就是我们想要的那种胜利。

动态 PGO 将在 RyuJIT 部分再次讨论。

▌文件 IO 改进

FileStream 几乎完全用 .NET 6 重写,重点是提高异步文件 IO 性能。在 Windows 上,实现不再使用阻塞 API,并且可以快几倍!我们还改进了所有平台上的内存使用。在第一次异步操作(通常分配)之后,我们已经使异步操作免分配!此外,我们已经使 Windows 和 Unix 实现不同的边缘情况的行为统一(这是可能的)。

这种重写的性能改进使所有操作系统受益。对 Windows 的好处是最大的,因为它远远落后。macOS 和 Linux 用户也应该会看到显着 FileStream 的性能改进。

以下基准将 100 MB 写入新文件。

private byte[] _bytes = new byte[8_000];[Benchmark]
public async Task Write100MBAsync()
{using FileStream fs = new("file.txt", FileMode.Create, FileAccess.Write, FileShare.None, 1, FileOptions.Asynchronous);for (int i = 0; i < 100_000_000 / 8_000; i++)await fs.WriteAsync(_bytes);
}

在带有 SSD 驱动器的 Windows 上,我们观察到4倍的加速和超过1200倍的分配下降:

方法运行意思是
比率
已分配
写100MBAsync.NET 5.01,308.2 毫秒1.003,809 KB
写100MBAsync.NET 6.0306.8 毫秒0.243 KB

我们还认识到需要更高性能的文件 IO 功能:并发读取和写入,以及分散/收集 IO。针对这些情况,我们为 System.IO.File 和 System.IO.RandomAccess 类引入了新的 API。

async Task AllOrNothingAsync(string path, IReadOnlyList<ReadOnlyMemory<byte>> buffers)
{using SafeFileHandle handle = File.OpenHandle(path, FileMode.Create, FileAccess.Write, FileShare.None, FileOptions.Asynchronous,preallocationSize: buffers.Sum(buffer => buffer.Length)); // hint for the OS to pre-allocate disk spaceawait RandomAccess.WriteAsync(handle, buffers, fileOffset: 0); // on Linux it's translated to a single sys-call!
}

该示例演示:

  • 使用新 File.OpenHandle API 打开文件句柄。

  • 使用新的预分配大小功能预分配磁盘空间。

  • 使用新的 Scatter/Gather IO API写入文件。

预分配大小功能提高了性能,因为写入操作不需要扩展文件,并且文件不太可能被碎片化。这种方法提高了可靠性,因为写入操作将不再因空间不足而失败,因为空间已被保留。Scatter/Gather IO API 减少了写入数据所需的系统调用次数。

▌更快的接口检查和转换

界面铸造性能提高了 16% - 38%。这种改进对于 C# 与接口之间的模式匹配特别有用。

ef68704ac354b7d116b225ea36508829.png

这张图表展示了一个有代表性的基准测试的改进规模。

将 .NET 运行时的一部分从 C++ 迁移到托管 C# 的最大优势之一是它降低了贡献的障碍。这包括接口转换,它作为早期的 .NET 6 更改移至 C#。.NET 生态系统中懂 C# 的人比懂 C++ 的人多(而且运行时使用具有挑战性的 C++ 模式)。仅仅能够阅读构成运行时的一些代码是培养以各种形式做出贡献的信心的重要一步。

归功于 Ben Adams。

▌System.Text.Json 源生成器

我们为 System.Text.Json 添加了一个源代码生成器,它避免了在运行时进行反射和代码生成的需要,并且可以在构建时生成最佳序列化代码。序列化程序通常使用非常保守的技术编写,因为它们必须如此。但是,如果您阅读自己的序列化源代码(使用序列化程序),您可以看到明显的选择应该是什么,可以使序列化程序在您的特定情况下更加优化。这正是这个新的源生成器所做的。

除了提高性能和减少内存之外,源代码生成器还生成最适合装配修整的代码。这有助于制作更小的应用程序。

序列化POCO是一种非常常见的场景。使用新的源代码生成器,我们观察到序列化速度比我们的基准快 1.6 倍。

方法
意思是
标准差
比率
串行器243.1 纳秒9.54 纳秒1.00
SrcGenSerializer149.3 纳秒1.91 纳秒0.62

TechEmpower 缓存基准测试平台或框架对来自数据库的信息进行内存缓存。基准测试的 .NET 实现执行缓存数据的 JSON 序列化,以便将其作为响应发送到测试工具。


请求/秒要求
net5.0243,0003,669,151
网6.0260,9283,939,804
net6.0 + JSON 源码生成364,2245,499,468

我们观察到约 100K RPS 增益(增加约 40%)。与MemoryCache 性能改进相结合时,.NET 6 的吞吐量比 .NET 5 高 50% !

5d239403787d0ab75371395b8122aa41.png

C# 10

7691c2a24435c674ea0f0a21a55a14cc.png

欢迎来到 C# 10。C# 10的一个主要主题是继续从C# 9中的顶级语句开始的简化之旅。新功能从 Program.cs 中删除了更多的仪式,导致程序只有一行。他们的灵感来自于与没有 C# 经验的人(学生、专业开发人员和其他人)交谈,并了解什么对他们来说最有效且最直观。

大多数.NET SDK 模板都已更新,以提供现在可以使用 C# 10 实现的更简单、更简洁的体验。我们收到反馈说,有些人不喜欢新模板,因为它们不适合专家,删除面向对象,删除在编写 C# 的第一天学习的重要概念,或鼓励在一个文件中编写整个程序。客观地说,这些观点都不正确。新模型同样适用于作为专业开发人员的学生。但是,它与 .NET 6 之前的 C 派生模型不同。

C# 10 中还有其他一些功能和改进,包括记录结构。

▌全局使用指令

全局 using 指令让您 using 只需指定一次指令并将其应用于您编译的每个文件。

以下示例显示了语法的广度:

• global using System;

• global using static System.Console;

• global using Env = System.Environment;

您可以将global using语句放在任何 .cs 文件中,包括在 Program.cs 中。

隐式 usings 是一个 MSBuild 概念,它会根据 SDK自动添加一组指令。例如,控制台应用程序隐式使用不同于 ASP.NET Core。

隐式使用是可选的,并在 a 中启用 PropertyGroup:

<ImplicitUsings>enable</ImplicitUsings>

隐式使用对于现有项目是可选的,但默认包含在新 C# 项目中。有关详细信息,请参阅隐式使用。

▌文件范围的命名空间

文件范围的命名空间使您能够声明整个文件的命名空间,而无需将剩余内容嵌套在{ ... }中. 只允许一个,并且必须在声明任何类型之前出现。

新语法是单个的一行:

namespace MyNamespace;class MyClass { ... } // Not indented

这种新语法是三行缩进样式的替代方案:

namespace MyNamespace
{class MyClass { ... } // Everything is indented
}

好处是在整个文件位于同一个命名空间中的极其常见的情况下减少缩进。

▌记录结构

C# 9 将记录作为一种特殊的面向值的类形式引入。在 C# 10 中,您还可以声明结构记录。C# 中的结构已经具有值相等,但记录结构添加了 == 运算符和 IEquatable<T> 的实现,以及基于值的 ToString 实现:

public record struct Person
{public string FirstName { get; init; }public string LastName { get; init; }
}

就像记录类一样,记录结构可以是“位置的”,这意味着它们有一个主构造函数,它隐式声明与参数对应的公共成员:

public record struct Person(string FirstName, string LastName);

但是,与记录类不同,隐式公共成员是可变的自动实现的属性。这样一来,记录结构就成为了元组的自然成长故事。例如,如果您有一个返回类型(string FirstName, string LastName),并且您希望将其扩展为命名类型,您可以轻松地声明相应的位置结构记录并维护可变语义。

如果你想要一个具有只读属性的不可变记录,你可以声明整个记录结构 readonly(就像你可以其他结构一样):

public readonly record struct Person(string FirstName, string LastName);

C# 10 不仅支持记录结构,还支持所有结构以及匿名类型的 with 表达式:

var updatedPerson = person with { FirstName = "Mary" }

e760191e2daa099a6f76393c4de9a6f9.png

F# 6

83c5ab56f0fe0649475cb4bede53e9b8.png

F# 6旨在让 F# 更简单、更高效。这适用于语言设计、库和工具。我们对 F# 6(及更高版本)的目标是消除语言中让用户感到惊讶或阻碍学习 F# 的极端情况。我们很高兴能与 F# 社区合作进行这项持续的努力。

让 F# 更快、更互操作

新语法task {…}直接创建一个任务并启动它。这是 F# 6 中最重要的功能之一,它使异步任务更简单、性能更高,并且与 C# 和其他 .NET 语言的互操作性更强。以前,创建 .NET 任务需要使用async {…}来创建任务并调用 Async.StartImmediateAsTask。

该功能 task {…}建立在称为“可恢复代码”RFC FS-1087的基础之上。可恢复代码是一个核心特性,我们希望在未来使用它来构建其他高性能异步和屈服状态机。

F# 6 还为库作者添加了其他性能特性,包括 InlineIfLambda 和F# 活动模式的未装箱表示。一个特别显着的性能改进在于列表和数组表达式的编译,现在它们的速度提高了4 倍,并且调试也更好、更简单。

让 F# 更易学、更统一

F# 6 启用expr[idx]索引语法。到目前为止,F# 一直使用 expr.[idx] 进行索引。删除点符号是基于第一次使用 F# 用户的反复反馈,点的使用与他们期望的标准实践有不必要的差异。在新代码中,我们建议系统地使用新的 expr[idx]索引语法。作为一个社区,我们都应该切换到这种语法。

F# 社区为使 F# 语言在 F# 6 中更加统一做出了重要改进。其中最重要的是消除了 F# 缩进规则中的一些不一致和限制。使 F# 更加统一的其他设计添加包括添加as图案;在计算表达式中允许“重载自定义操作”(对 DSL 有用);允许_丢弃use绑定并允许%B在输出中进行二进制格式化。F# 核心库添加了用于复制和更新列表、数组和序列的新函数,以及其他NativePtr内在函数。自 2.0 起弃用的 F# 的一些旧功能现在会导致错误。其中许多更改更好地使 F# 与您的期望保持一致,从而减少意外。

F# 6 还增加了对 F# 中其他“隐式”和“类型导向”转换的支持。这意味着更少的显式向上转换,并为 .NET 样式的隐式转换添加了一流的支持。F# 也进行了调整,以更好地适应使用 64 位整数的数字库时代,并隐式扩展了 32 位整数。

改进 F# 工具

F# 6 中的工具改进使日常编码更容易。新的“管道调试”允许您单步执行、设置断点并检查 F# 管道语法input |> f1 |> f2 的中间值。阴影值的调试显示已得到改进,消除了调试时常见的混淆源。F# 工具现在也更高效,F# 编译器并行执行解析阶段。F# IDE 工具也得到了改进。F# 脚本现在更加健壮,允许您通过global.json文件固定使用的 .NET SDK 版本。

0a078b9615335d2ad1e8d9a0d2b97f90.png

热重载

e378138474af9bc8ef625af6f176f447.png

Hot Reload 是另一个性能特性,专注于开发人员的生产力。它使您能够对正在运行的应用程序进行各种代码编辑,从而缩短您等待应用程序重新构建、重新启动或重新导航到您在进行代码更改后所在位置所需的时间。

Hot Reload 可通过dotnet watch CLI 工具和 Visual Studio 2022 使用。您可以将 Hot Reload 与多种应用类型一起使用,例如 ASP.NET Core、Blazor、.NET MAUI、控制台、Windows 窗体 (WinForms)、WPF、WinUI 3、Azure 函数等。

使用 CLI 时,只需使用 启动您的 .NET 6 应用程序dotnet watch,进行任何受支持的编辑,然后在保存文件时(如在 Visual Studio Code 中),这些更改将立即应用。如果不支持更改,详细信息将记录到命令窗口。

9a54d84dbafca8100cc8707be7e3f6e2.png

此图像显示了一个使用 dotnet watch. 我对.cs文件和.cshtml 文件进行了编辑(如日志中所述),两者都应用于代码并在不到半秒的时间内非常快速地反映在浏览器中。

使用 Visual Studio 2022 时,只需启动您的应用程序,进行支持的更改,然后使用新的“热重载”按钮(如下图所示)应用这些更改。您还可以通过同一按钮上的下拉菜单选择在保存时应用更改。使用 Visual Studio 2022 时,热重载可用于多个 .NET 版本,适用于 .NET 5+、.NET Core 和 .NET Framework。例如,您将能够对按钮的OnClickEvent 处理程序进行代码隐藏更改。应用程序的 Main 方法不支持它。

0a09e4da8c30e7ffa17724a3340f7745.png

注意:RuntimeInformation.FrameworkDescription 中存在一个错误,该错误将在该图像中展示,很快就会修复。

Hot Reload 还与现有的 Edit and Continue 功能(在断点处停止时)以及用于实时编辑应用程序 UI 的 XAML Hot Reload 协同工作。目前支持 C# 和 Visual Basic 应用程序(不是 F#)。

1ea1684b31f40cf4a97b4e0dd08cac7e.png

安全

3cc20cb027edb9e2619adf35b40bf941.png

.NET 6 中的安全性得到了显着改进。它始终是团队关注的重点,包括威胁建模、加密和深度防御防御。

在 Linux 上,我们依赖 OpenSSL 进行所有加密操作,包括 TLS(HTTPS 必需)。在 macOS 和 Windows 上,我们依赖操作系统提供的功能来实现相同的目的。对于每个新版本的 .NET,我们经常需要添加对新版本 OpenSSL 的支持。.NET 6 增加了对OpenSSL 3的支持。

OpenSSL 3 的最大变化是改进的 FIPS 140-2模块和更简单的许可。

.NET 6 需要 OpenSSL 1.1 或更高版本,并且会更喜欢它可以找到的最高安装版本的 OpenSSL,直到并包括 v3。在一般情况下,当您使用的 Linux 发行版默认切换到 OpenSSL 3 时,您最有可能开始使用 OpenSSL 3。大多数发行版还没有这样做。例如,如果您在 Red Hat 8 或 Ubuntu 20.04 上安装 .NET 6,您将不会(在撰写本文时)开始使用 OpenSSL 3。

OpenSSL 3、Windows 10 21H1 和 Windows Server 2022 都支持ChaCha20Poly1305。您可以在 .NET 6 中使用这种新的经过身份验证的加密方案(假设您的环境支持它)。

感谢 Kevin Jones 对 ChaCha20Poly1305 的 Linux 支持。

我们还发布了新的运行时安全缓解路线图。重要的是,您使用的运行时不受教科书攻击类型的影响。我们正在满足这一需求。在 .NET 6 中,我们构建了W^X和英特尔控制流强制技术 (CET)的初始实现。W^X 完全受支持,默认为 macOS Arm64 启用,并且可以选择加入其他环境。CET 是所有环境的选择加入和预览。我们希望在 .NET 7 中的所有环境中默认启用这两种技术。

更多攻略欢迎转到下一篇文章,继续阅读哦!

40b40a57cb71d4cdb4e3ef5e97d5cb98.gif

 了解更多.NET 6 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win7下JDK环境变量的设置

JDK并不像Microsoft阵营vs那样智能&#xff0c;安装好后所有的东西都给你配置好了&#xff0c;我们还没需要手动配置很多东西 首先说为什么要配置JDK的环境变量在任何路径下识别java命令和java类 配置分为2个部分&#xff0c;1&#xff0c;java命令路径。2,java加载类 分为3个步…

简单模拟实现简单的当登录延时的效果

①、先建立一个activaty去部署我们的登陆界面 1 package com.example.administrator.actionbardemo;2 3 import android.app.Activity;4 import android.content.Intent;5 import android.os.Bundle;6 import android.view.View;7 import android.widget.Button;8 import andro…

《音乐达人秀:Adobe Audition实战200例》——实例11 录制任意音量音乐

本节书摘来自异步社区《音乐达人秀&#xff1a;Adobe Audition实战200例》一书中的第2章&#xff0c;实例11 &#xff0c;作者 健逗&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 实例11 录制任意音量音乐 这个实例将讲解如何任意控制录音过程中的音量。你…

我的技术回顾2019不止技术的一年

这篇本想具体说下ABP的商业模式的演进与变化&#xff0c;因为愿意像我这样花费心力去研究他的人不多。写着的时候&#xff0c;就得没必要。真有这种想法的人&#xff0c;也会自己研究&#xff0c;我何必去写呢。2019年初&#xff0c;因为各种原因&#xff0c;加上企业资源的调整…

linux之在当前目录下删除不包含aa的文件

1、问题 1、当前目录下删除不包含aa的文件和文件夹2、解决办法 1、rm -rf ls -al | grep -v "aa"

设计模式(1)--简单工厂模式、策略模式

设计模式&#xff08;1&#xff09;--简单工厂模式、策略模式 1. 简单工厂模式 在阎宏博士的《JAVA与模式》一书中开头是这样描述简单工厂模式的&#xff1a;简单工厂模式是类的创建模式&#xff0c;又叫做静态工厂方法&#xff08;Static Factory Method&#xff09;模式。简单…

kmp算法讲解

转自——http://blog.csdn.net/v_july_v/article/details/7041827 看到kmp是不是立即想到(*ο*) 哇&#xff5e;&#xff0c;那个东西啊&#xff0c;就是拿来放电影的那个啊&#xff01; 哦&#xff0c;但是这里我们说的并不是那个东西&#xff0c;身为一名C选手&#xff0c;我…

TLS/SSL协议工作原理

1、TLS/SSL的功能实现原理简单介绍 HTTPS协议的主要功能基本都依赖于TLS/SSL协议,TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的…

实现DDD领域驱动设计: Part 4

原文链接: https://dev.to/salah856/implementing-domain-driven-design-part-iv-29m2对象到对象映射当两个对象具有相同或相似的属性时&#xff0c;自动对象到对象映射是一种将值从一个对象复制到另一个对象的有用方法。DTO和实体类通常具有相同/相似的属性&#xff0c;你通常…

软件项目组织管理(六)项目时间管理

文章目录项目计划和进度计划什么是活动活动清单活动属性里程碑时间管理的过程1. 活动定义2. 活动排序三种依赖关系箭线图法&#xff08;ADM&#xff09;/双代号网络&#xff08;AOA&#xff09;前导图法&#xff08;PDM&#xff09;/单代号网络&#xff08;AON&#xff09;3. 活…

win7开机按F8后,为什么没有修复计算机的选项

有时win7开机按F8后&#xff0c;没有修复计算机的选项本文将向大家介绍如何通过 Windows 7自带的“配置 Windows 恢复环境(RE)”命令 – ReagentC.exe&#xff0c;启用“高级启动选项”下的“修复计算机”选项。单击 Windows 开始图标&#xff0c;在“搜索程序和文件”输入框中…

TLS/SSL握手过程

参考了:https://www.wosign.com/faq/faq2016-0309-04.htm 1、握手与密钥协商过程 基于RSA握手和密钥交换的客户端验证服务器为示例详解TLS/SSL握手过程。 (1).client_hello 客户端发起请求,以明文传输请求信息,包含版本信息,加密套件候选列表,压缩算法候选列表,随机数,扩…

FluentValidation在C#中是怎么进行数据验证的

介绍FluentValidation 是一个基于 .NET 开发的验证框架&#xff0c;用于构建强类型验证规则的 .NET 库。开源免费支持 .Net所有平台 包括.NetFramework和.NetCore.FluentValidation 组件内提供十几种常用验证器&#xff0c;可扩展性好&#xff0c;支持自定义验证器&#xff0c;…

基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用...

Bootstrap文件上传插件File Input是一个不错的文件上传控件&#xff0c;但是搜索使用到的案例不多&#xff0c;使用的时候&#xff0c;也是一步一个脚印一样摸着石头过河&#xff0c;这个控件在界面呈现上&#xff0c;叫我之前使用过的Uploadify 好看一些&#xff0c;功能也强大…

软件项目组织管理(七)项目成本管理

文章目录什么是成本什么是项目成本学习曲线理论储备金什么是项目成本管理目的过程成本估算成本估算的工具和技术成本预算主要工作成本估算和成本预算的关系和区别成本管理的工具方法净现值投资回报率挣值分析法什么是成本 为达到一个特定目标而花费的资源。 什么是项目成本 …

大话领域驱动设计——简介

如果说当下最热门的技术概念或架构思想&#xff0c;那么领域驱动设计&#xff08;DDD&#xff09;一定占有一席之地。上个系列&#xff0c;我讲了ABP vNext框架在微服务架构下的落地思路&#xff0c;而ABP vNext是基于DDD思想的完整框架之一&#xff0c;同时DDD也是微服务架构服…

软件项目组织管理(八)项目质量管理

文章目录软件质量的重要性对质量的认识传统的认识新的认识质量与等级什么是质量什么是质量管理什么是软件质量软件项目管理的目标质量管理的过程质量管理发展的四个阶段戴明改进循环&#xff08;PDCA循环&#xff09;项目质量计划编制方法——质量标杆法影响项目质量的因素(5M1…

Avalonia跨平台入门第十九篇之语音播放

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送;今天趁着大周末的时间接着去…

软件项目组织管理(九)项目人力资源管理

文章目录什么是人力资源人力资源的特征什么是项目人力资源管理管理员工的关键所在马斯洛的需求层次理论赫兹伯格的双因素理论权力理论提高项目工作有效性的7种习惯人力资源管理过程人力资源管理的工具方法责任分配矩阵资源负荷资源平衡团队发展的5个阶段&#xff08;塔克曼模型…

javax.jdo.option.ConnectionURL配置的问题

2019独角兽企业重金招聘Python工程师标准>>> Hive安装过程中出现 The reference to entity "createDatabaseIfNotExist" must end with the ; delimiter.问题&#xff0c;具体如下所示&#xff1a; [Fatal Error] hive-site.xml:132:95: The reference to…