头图

今天我们发布了 .NET 7 预览版 7。这是 .NET 7 的最后一个预览版,下一个版本将是我们的第一个候选版本 (RC)。 .NET Conf 2022 的日期已经公布! 请于 2022 年 11 月 8 日至 10 日加入我们一起庆祝 .NET 7 的发布!

Visual Studio 2022 17.3 也在今天发布,对 .NET 多平台应用程序 UI (MAUI) 提供 GA 支持。 阅读 .NET MAUI 公告并收听 .NET Conf:关注MAUI直播!
.NET 7 预览版包括对 System.LINQ、Unix 文件权限、低级结构、p/Invoke 源代码生成、代码生成和 websocket 的改进。

您可以下载适用于 Windows、macOS 和 Linux 的 .NET 7 预览版7。
安装程序和二进制文件
容器镜像
Linux 软件包
发行说明
已知的问题
GitHub 问题跟踪器

.NET 7 预览版 7 已使用 Visual Studio 17.4 预览版 1 进行了测试。如果您想在 Visual Studio 系列产品中试用 .NET 7,我们建议您使用预览频道版本。 如果您使用的是 macOS,我们建议使用最新的 Visual Studio 2022 for Mac 预览版。 现在,让我们了解一下此版本中的一些最新更新。

使用 System.LINQ 简化排序

dotnet/runtime#67194

System.Linq 现在有方法 Order 和 OrderDescending,它们可以根据 T 对 IEnumerable 进行排序。
IQueryable 现在也支持这个。
注意:此更改不会向 System.Linq.Expressions 引入新的语言功能。
用法
以前,您必须通过引用自己的值来调用 OrderBy/OrderByDescending。
var data = new[] { 2, 1, 3 };
var sorted = data.OrderBy(static e => e);
var sortedDesc = data.OrderByDescending(static e => e);
现在,您可以编写为:
var data = new[] { 2, 1, 3 };
var sorted = data.Order();
var sortedDesc = data.OrderByDescending();

支持 Unix 文件模式

dotnet/runtime PR#69980

以前,.NET没有对获取和设置Unix文件权限的内置支持,Unix文件权限控制哪些用户可以读、写和执行文件和目录。P/Invoking 手动调用系统并不总是那么容易,因为有些在不同的发行版上以不同的方式公开。 例如,在Ubuntu上你可能需要调用__xstat,在RedHat上调用stat等。 这使得一流的 .NET API 很重要。
在预览版7 中,我们引入了一个新的枚举:
public enum UnixFileMode
{

None,
OtherExecute, OtherWrite, OtherRead,
GroupExecute, GroupWrite, GroupRead,
UserExecute, UserWrite, UserRead,
 ...

}

以及 API File.GetUnixFileMode 和 File.SetUnixFileMode,它们在路径或句柄(文件描述符)上获取和设置文件模式。 以及 FileInfo 和 DirectoryInfo 上一个名为 UnixFileMode 的新属性。
还有一个新的 Directory.CreateDirectory 重载和 FileStreamOptions 上的一个新属性,允许您一次性创建具有特定模式的目录或文件。 请注意,当您使用这些时,仍会应用 umask,就像您在 shell 中创建目录或文件一样。
用法
/ 创建具有特定权限的新目录
Directory.CreateDirectory("myDirectory", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute);

// 创建具有特定权限的新文件
FileStreamOptions options = new()
{

Access = FileAccess.Write,
Mode = FileMode.Create,
UnixCreateMode =  UnixFileMode.UserRead | UnixFileMode.UserWrite,

};
using FileStream myFile = new FileStream("myFile", options);

// 获取现有文件的模式
UnixFileMode mode = File.GetUnixFileMode("myFile");

// 设置现有文件的模式
File.SetUnixFileMode("myFile", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute);

查看所有新的 Unix 文件模式 API。

非常感谢 @tmds,他是 Red Hat 的长期贡献者,他提出、设计和实现了这个功能。

低级结构改进:ref 字段支持

.NET 7 运行时现在完全支持 ByRefLike 类型(即 ref struct)中的 ref 字段。 在这个备受期待的功能背后有广泛的语言设计,用户可以阅读:低级结构改进。 借助此功能,以前需要在运行时进行专门处理的类型(例如,Span<T> 和 ReadOnlySpan<T>)现在可以在 C# 中完全实现。

LibraryImport P/Invoke 源生成器

dotnet/runtime#60595

LibraryImport 源生成器现在以受支持的方式提供给所有用户。 超过18个月的努力,这个源生成器被设计成大多数DllImport使用的直接替代品,无论是在运行时产品和用户代码中。 .NET 库都采用了 LibraryImport,并且自 .NET 7 预览版 1 以来一直附带源代码生成的编组代码。
源代码生成器随 .NET 7 TFM 一起提供,可随时使用。 为了获得源生成编组的好处,请将 DllImport 的用法替换为 LibraryImport。 有分析器和固定器可以帮助完成这个过程。
用法

public static class Native
{

[DllImport(nameof(Native), CharSet = CharSet.Unicode)]
public extern static string ToLower(string str);

}

public static class Native
{

[LibraryImport(nameof(Native), StringMarshalling = StringMarshalling.Utf16)]
public static partial string ToLower(string str);

}
有一个分析器和代码修复程序可以自动将您的 DllImport 属性转换为 LibraryImport。 对于预览版7,它是可选的。 将 dotnet_diagnostic.SYSLIB1054.severity = suggestion添加到您的 编辑器配置 文件以启用转换分析器作为诊断。
有关编组自定义类型的设计文档和详细信息可以在 docs/design/libraries/LibraryImportGenerator 找到。

ClientWebSocket 升级响应详细信息

dotnet/runtime#25918

ClientWebSocket 以前没有提供有关升级响应的任何详细信息。 但是,有关响应标头和状态代码的信息在失败和成功方案中可能都很重要。
在失败的情况下,状态码可以帮助区分可重回和不可重回错误(服务器根本不支持 Web 套接字,而只是一个微小的暂时性错误)。 标头还可能包含有关如何处理这种情况的附加信息。
即使在成功的 Web 套接字连接的情况下,标头也很有帮助,例如,它们可以包含绑定到会话的token、一些与子协议版本相关的信息,或者服务器可能即将关闭等。
用法
ClientWebSocket ws = new();
ws.Options.CollectHttpResponseDetails = true;
try
{

await ws.ConnectAsync(uri, default);

// 成功场景

ProcessSuccess(ws.HttpResponseHeaders);
ws.HttpResponseHeaders = null; // 清理(如果需要)

}
catch (WebSocketException)
{

// 失败场景
if (ws.HttpStatusCode != null)
{
    ProcessFailure(ws.HttpStatusCode, ws.HttpResponseHeaders);
}

}

CodeGen 的改进

非常感谢JIT社区贡献者对这些社区PR的贡献!
@MichalPetryka 修复了 PR #71633 中的问题 #71632 使 getTypeForPrimitiveValueClass 将不同的符号视为不同的类型。
@shushanhf 在 LoongArch64 中做了 2 个修复
@singleaccretion 在 预览版 7 期间做出了 20 项 PR 贡献
@SkiFoD 如果参数之一是常量,则优化为使用 Min/Max 内部函数 (PR #69434)。
• 对于 Arm664,@a74nhPR #71616 中实现了 #67894 的第一部分,它为条件比较和选择指令生成 csel 和 ccmp(问题 #55364)。

循环优化

在预览版 7 中,我们对循环优化进行了多项改进。
PR #71184 加强了对循环表的检查,以便更好地检查循环完整性,如 #71084 中所述。
PR #71868 不要在循环周围压缩块
PR #71659 在非轮廓方法中调整具有轮廓内循环的块的权重
PR #71504 循环提升的改进
PR #70271 优化多维数组访问。 它将延迟提高了 67%(性能链接)。
此外,在 PR #71236 中为异常处理 函数启用了热/冷拆分。

贡献者聚光灯:Hugh Bellamy

非常感谢我们所有的社区成员。 我们非常感谢您的周到贡献。 我们请贡献者@hughbe 分享他的想法。

image.png

用 Hugh自己的话说:
我开发的第一个应用程序是在我十几岁的时候。 尽管“Hughser”,一个围绕 WebBrowser 组件的 C# 包装器,很遗憾没有赢得浏览器大战,但 .NET 是我进入软件开发世界的第一个窗口。在为 iOS 开发应用程序几年后,当 roslyn、corefx 和 coreclr 开源时,我重新对 .NET 产生了兴趣。我很高兴有机会深入黑匣子,看看我使用的 SDK 是如何工作的。我在 2015 年 11 月的第一个 PR 是清理并添加 System.String 上各种方法的测试。(任何看过我的贡献历史的人都很清楚,清理,改进和添加测试成为我的专长!)。我很快就获得了贡献的信心,并成为 .NET 开源最活跃的贡献者之一。我现在为各种 .NET Foundation 项目做出了贡献,包括 corefx/coreclr/runtime、roslyn、xunit、mono、wpf 和 winforms。我贡献的一个亮点绝对是当我被微软飞往西雅图参加2019年微软Build大会时,与团队见面并在.NET Keynote上大声疾呼!由于我的贡献,我还连续三次获得微软MVP奖,我为此感到非常自豪。
过去,我对 .NET 的贡献帮助我在青少年时期获得了作为初级开发人员的实习机会。我目前是一名专门从事金融服务数据和分析的管理顾问。虽然现在我的时间比在中学和大学的时间少,但我仍然非常关注 .NET 开源生态系统,并在 GitHub 上以 @hughbe 用户名维护了几个 .NET 开源项目。编码和开源一直是我的爱好,也是我喜欢与我的工作相结合的东西。 .作为一名政治学本科生,我对如何在政治和社会环境中使用技术感兴趣。例如,作为柬埔寨一家非政府组织的实习生,我在 .NET 中开发了一个 Facebook 抓取平台,其中部分内容是我开源的。

为 .NET 做贡献是一次不可思议的经历——在我十几岁的时候,我几乎每天都在与从未谋面的人远程工作。 微软 的团队和开源社区的其他成员都非常乐于助人、富有洞察力并且乐于接受挑战。 有很多方法可以开始,无论是提交还是审查问题、文档和 PR,所以今天就开始吧!

面向 .NET 7

若要面向 .NET 7,您需要在项目文件中使用 .NET 7 目标框架名字对象(TFM)。 例如:<TargetFramework>net7.0</TargetFramework>
以下是全套 .NET 7 TFM,包括特定于操作的 TFM。
• net7.0
• net7.0-android
• net7.0-ios
• net7.0-maccatalyst
• net7.0-macos
• net7.0-tvos
• net7.0-windows
我们希望很简单的从 .NET 6 升级到 .NET 7 。 请报告您在使用 .NET 7 测试现有应用程序的过程中发现的任何重大更改。

支持

.NET 7 是一个短期支持 (STS) 版本,这意味着它将在发布之日起 18 个月内获得免费支持和补丁。 请务必注意,所有版本的质量都是相同的。唯一的区别是支持的长度。有关 .NET 支持政策的更多信息,请参阅 .NET 和 .NET Core 官方支持政策。

我们最近将“当前”名称更改为“短期支持 (STS)”。 我们正在推出这一变化

重大更改

修剪和本机AOT:默认情况下修剪所有程序集
为了更好地满足用户期望并生成更小、更高效的应用程序,默认情况下,修剪现在会修剪控制台应用中的所有程序集。此更改仅影响使用 PublishTrimmed=true 发布的应用程序,并且仅影响具有现有修剪警告的应用程序。 它也只影响不使用 Windows 桌面、Android、iOS、WASM 或 ASP.NET SDK 的普通 .NET 应用程序。

以前的行为

以前,只有在库项目文件中选择加入 <IsTrimmable>true</IsTrimmable> 的程序集才会被修剪。

新行为

从 .NET 7 开始,默认情况下,修整会修整应用中的所有程序集。以前可能使用 PublishTrimmed 的应用程序可能无法在 .NET 7 中运行。但是,只有带有修剪警告的应用程序会受到影响。如果您的应用没有修剪警告,则行为更改不应造成任何不利影响,并且可能会减小应用大小。
例如,使用 Newtonsoft.Json 或 System.Text.Json 而不生成源代码的应用程序在用户项目中序列化和反序列化某个类型可能在更改之前已经运行,因为用户项目中的类型已完全保留。但是,将存在一个或多个修剪警告(警告代码 ILxxxx)。现在,用户项目中的类型被修剪,序列化可能会失败或产生意外的结果。
如果您的应用确实有修剪警告,您可能会看到行为更改或异常。 例如,使用 Newtonsoft.Json 或 System.Text.Json 而不生成源代码的应用程序在用户项目中序列化和反序列化某个类型可能在更改之前已经运行,因为用户项目中的类型已完全保留。但是,将存在一个或多个修剪警告(警告代码 ILxxxx)。现在,用户项目中的类型被修剪,序列化可能会失败或产生意外的结果。

建议的操作

最佳的解决方案是解决应用程序中的所有修剪警告。若要还原到以前的行为,请将 TrimMode 属性设置为 partial,这是 .NET 7 之前的行为。
<TrimMode>partial</TrimMode>
默认的.NET 7+ 值为full:
<TrimMode>full</TrimMode>

其他重大更改

您可以通过阅读 .NET 7 中的重大更改文档找到最新的 .NET 7 重大更改列表。 它按区域和版本列出了重大更改,并附有详细说明的链接。
若要查看提出了哪些重大更改但仍在审核中,请关注 Proposed .NET Breaking Changes GitHub 问题。

路线图

.NET 的发行版包括产品、库、运行时和工具,并表示 Microsoft 内部和外部多个团队之间的协作。您可以通过阅读产品路线图了解有关这些方面的更多信息:
ASP.NET Core 7 和 Blazor 路线图
EF 7 路线图
ML.NET
.NET MAUI
WinForms
WPF
NuGet
Roslyn
Runtime


我们感谢您对 .NET 的所有支持和贡献。 请尝试使用.NET 7预览版 7 并告诉我们您的想法!

前往查看.NET 7 预览版7,以及进行相关程序下载安装。
image.png
长按识别二维码
点击查看.NET 7 预览版7~


微软技术栈
418 声望994 粉丝

微软技术生态官方平台。予力众生,成就不凡!微软致力于用技术改变世界,助力企业实现数字化转型。