共计 6636 个字符,预计需要花费 17 分钟才能阅读完成。
明天咱们公布了 .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,@a74nh 在 PR #71616 中实现了 #67894 的第一局部,它为条件比拟和抉择指令生成 csel 和 ccmp(问题 #55364)。
循环优化
在预览版 7 中,咱们对循环优化进行了多项改良。
• PR #71184 增强了对循环表的查看,以便更好地查看循环完整性,如 #71084 中所述。
• PR #71868 不要在循环四周压缩块
• PR #71659 在非轮廓办法中调整具备轮廓内循环的块的权重
• PR #71504 循环晋升的改良
• PR #70271 优化多维数组拜访。它将提早进步了 67%(性能链接)。
此外,在 PR #71236 中为异样解决 函数启用了热 / 冷拆分。
贡献者聚光灯:Hugh Bellamy
非常感谢咱们所有的社区成员。咱们十分感谢您的周到奉献。咱们请贡献者 @hughbe 分享他的想法。
用 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,以及进行相干程序下载安装。
长按辨认二维码
点击查看.NET 7 预览版 7~