3

官宣.NET 6 预览版 7

 2 years ago
source link: https://segmentfault.com/a/1190000040733972
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

官宣.NET 6 预览版 7

我们很高兴发布 .NET 6 预览版7。这是我们进入(两个)发布候选 (RC) 期之前的最后一次预览。在我们放慢发布速度之前,团队一直在熬夜,竭尽全力获取最后一组功能。在这个版本中,您将看到对各种功能的最后一点润色,以及大量的整体发布功能。从这一点来看,团队将专注于将所有功能实现统一(高)质量,以便 .NET 6 为您的生产工作负载做好准备。

关于生产工作负载的话题,值得提醒大家的是,.NET 网站Bing.com自预览版 1 以来一直在 .NET 6 上运行。我们正在与各个团队(Microsoft 和其他团队)讨论使用.NET 6 RC进行生产。如果您对此感兴趣并希望获得有关如何处理该问题的指导,请联系 [email protected]。我们总是乐于与早期采用者交谈。

您可以下载适用于 Linux、macOS 和 Windows 的.NET 6 预览版7

  • 安装程序和二进制文件
  • 容器镜像
  • Linux 软件包
  • 发行说明
  • API差异
  • 已知的问题
  • GitHub 问题跟踪器

请参阅.NET MAUIASP.NET Core,了解有关客户端和 Web 应用程序场景新增功能的更多详细信息。

.NET 网站:

https://dotnet.microsoft.com/...

Bing.com:

https://cn.bing.com/

.NET 6 预览版7:

https://dotnet.microsoft.com/...

安装程序和二进制文件:

https://dotnet.microsoft.com/...

容器镜像:

https://hub.docker.com/_/micr...

Linux 软件包:

https://github.com/dotnet/cor...

发行说明:

https://github.com/dotnet/cor...

API差异:

https://github.com/dotnet/cor...

已知的问题:

https://github.com/dotnet/cor...

GitHub 问题跟踪器:

https://github.com/dotnet/cor...

.NET MAUI:

https://devblogs.microsoft.co...

ASP.NET Core:

https://devblogs.microsoft.co...

.NET 6 预览版7 已经过测试,并且受Visual Studio 2022 预览版3 支持。Visual Studio 2022 使您能够利用为 .NET 6 开发的 Visual Studio 工具,例如在 .NET MAUI 中开发、C# 应用程序的热重载、新的WebForms 的网页实时预览,以及 IDE 体验中的其他性能改进。Visual Studio Code也支持 .NET 6。Visual Studio Code 的 C# 扩展的最新版本已针对 .NET 6 预览版7 进行了更新,并且包括对 C# 10 的支持。

查看新的对话帖子,就最新的 .NET 功能进行工程师对工程师的深入讨论。我们还发布了有关C# 10 中的字符串插值和 .NET 6 中的 .NET 6 预览功能 – 通用数学的帖子。

Visual Studio 2022 预览版3:

https://dotnet.microsoft.com/...

Visual Studio Code:

https://code.visualstudio.com...

Visual Studio Code 的 C# 扩展:

https://marketplace.visualstu...

新的对话帖子:

https://devblogs.microsoft.co...

C# 10 中的字符串插值和 .NET 6 中的 .NET 6 预览功能 – 通用数学:

https://devblogs.microsoft.co...

.NET SDK:现代化的 C# 项目模板

我们更新了 .NET SDK 模板以使用最新的 C# 语言功能和模式。我们已经有一段时间没有在新的语言功能方面重新审视模板了。是时候这样做了,我们将确保模板在未来使用新的和现代的功能。

新模板中使用了以下语言功能:

  • 异步Main
  • 全局 using 指令(通过 SDK 驱动的默认值)
  • 文件范围的命名空间
  • 目标类型的新表达式
  • 可空引用类型

您可能想知道为什么我们通过模板启用某些功能,而不是在面向 .NET 6的 项目中默认启用它们。我们同意您需要做一些工作来将应用程序升级到 .NET 的新版本用于改进平台的默认行为。这使我们可以改进产品,而不会随着时间的推移使项目文件复杂化。但是,该模型的某些功能可能会具有破坏性,例如可为空的引用类型。我们不想将这些功能与升级体验联系起来,但希望将选择权留给您自己,无论何时何地。模板是一个风险低得多的枢轴点,我们可以在其中为新代码设置新的“良好默认模型”,而几乎没有后续影响。通过项目模板启用这些功能,我们获得了两全其美:新代码从启用这些功能开始,但升级时现有代码不受影响。

更新了 .NET SDK 模板:

https://github.com/dotnet/tem...

1.控制台模板

控制台模板展示了最大的变化。由于顶级语句和全局 using 指令,它现在(实际上)变成了一行代码。

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

同一模板的 .NET 5 版本包括几行熟悉的代码,以前甚至单行代码必须使用该结构。

using System;
​
namespace Company.ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
        }
    }
}

控制台模板的项目文件也已更改,以启用可为空引用类型功能,如下例所示。

<Project Sdk="Microsoft.NET.Sdk">
​
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>
​
</Project>

其他模板还支持可空型、隐式全局使用和文件范围的命名空间,包括 ASP.NET Core 和类库。

可为空引用类型:

https://docs.microsoft.com/zh...

2.ASP.NET 网页模板

Web 模板也同样减少了代码行数,使用相同的功能。

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
​
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
​
app.MapGet("/", () => "Hello World!");
​
app.Run();

3.ASP.NET MVC 模板

mvc 模板在结构上是相似的。在本例中,我们已将 Program.cs 和 Startup.cs 合并到一个文件 (Program.cs) 中,从而进一步简化。

var builder = WebApplication.CreateBuilder(args);
​
// Add services to the container.
builder.Services.AddControllersWithViews();
​
var app = builder.Build();
​
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
    app.UseHsts();
}
​
app.UseHttpsRedirection();
app.UseStaticFiles();
​
app.UseRouting();
​
app.UseAuthorization();
​
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");
​
app.Run();

4.模板兼容性

有关使用新模板的兼容性问题,请参阅以下文档。

早期 .NET 版本不支持模板中的 C# 代码:

https://docs.microsoft.com/zh...

隐式命名空间导入 :

https://docs.microsoft.com/zh...

库:用于可空型信息的反射 API

可为空引用类型是编写可靠代码的重要特性。它适用于编写代码,但不适用于(直到现在)检查它。新的反射 API使您能够确定给定方法的参数和返回值的可空型性质。例如,这些新的 API 对基于反射的工具和序列化程序至关重要。

对于上下文,我们在 .NET 5 中向 .NET 库添加了可为空的注释(并在 .NET 6 中完成),并且正在对本版本的ASP.NET Core 做同样的事情。我们还看到开发人员为他们的项目采用可空型

可空型信息使用自定义属性保存在元数据中。原则上,任何人都可以读取自定义属性,但是,这并不理想,因为使用编码是很重要的。

以下示例演示了将新 API 用于几个不同的场景。

新的反射 API:

https://github.com/dotnet/run...

开发人员为他们的项目采用可空型:

https://github.com/jellyfin/j...

自定义属性保存在元数据中:

https://github.com/dotnet/ros...

1.获取顶级可空型信息

假设您正在实现一个序列化程序。使用这些新的 API,序列化程序可以检查给定的属性是否可以设置为 null:

private NullabilityInfoContext _nullabilityContext = new NullabilityInfoContext();
​
private void DeserializePropertyValue(PropertyInfo p, object instance, object? value)
{
    if (value is null)
    {
        var nullabilityInfo = _nullabilityContext.Create(p);
        if (nullabilityInfo.WriteState is not NullabilityState.Nullable)
        {
            throw new MySerializerException($"Property '{p.GetType().Name}.{p.Name}'' cannot be set to null.");
        }
    }
​
    p.SetValue(instance, value);
}

2.获取嵌套的可空型信息

可空型对可以(正式)保存其他对象(如数组和元组)的对象进行了特殊处理。例如,您可以指定数组对象(作为变量,或作为类型成员签名的一部分)必须为非空,但元素可以为空,反之亦然。使用新的反射 API 可以检查这种额外级别的特异性,如以下示例所示。

class Data
{
    public string?[] ArrayField;
    public (string?, object) TupleField;
}
private void Print()
{
    Type type = typeof(Data);
    FieldInfo arrayField = type.GetField("ArrayField");
    FieldInfo tupleField = type.GetField("TupleField");
    NullabilityInfoContext context = new ();
​
    NullabilityInfo arrayInfo = context.Create(arrayField);
    Console.WriteLine(arrayInfo.ReadState);        // NotNull
    Console.WriteLine(arrayInfo.Element.State);    // Nullable
​
    NullabilityInfo tupleInfo = context.Create(tupleField);
    Console.WriteLine(tupleInfo.ReadState);                      // NotNull
    Console.WriteLine(tupleInfo.GenericTypeArguments [0].State); // Nullable
    Console.WriteLine(tupleInfo.GenericTypeArguments [1].State); // NotNull
}

库:ZipFile 尊重 Unix 文件权限

在类 Unix 操作系统上提取 zip 压缩文件时,System.IO.Compression.ZipFile 类现在可以在创建和设置文件权限期间捕获 Unix 文件权限。此更改允许通过 zip 来回传送可执行文件,这意味着您不再需要在解压缩 zip 后修改文件权限以使文件可执行。它还尊重用户、组和其他人的读/写权限。

如果 zip 不包含文件权限(因为它是在 Windows 上创建的,或者使用未捕获权限的工具,如 .NET 的早期版本),则提取的文件将获得默认文件权限,就像任何其他新创建的文件。

Unix 文件权限也适用于其他 zip 工具,包括:

Info-ZIP:

https://sourceforge.net/proje...

7-Zip:

https://www.7-zip.org/

.NET 7 早期功能预览:通用数学

对于 .NET 6,我们已经构建了将 API 标记为“预览中”的功能。这种新方法将使我们能够跨多个主要版本提供和发展预览功能。为了使用预览 API,项目需要明确选择使用预览功能。从 .NET 6 RC1 开始,如果您在未明确选择的情况下使用预览功能,您将看到带有可操作消息的构建错误。在以后的版本中,预览功能可能会以颠覆性的方式发生变化。这就是它们需要您选择添加的原因。

我们在 .NET 6 中预览的其中一项功能是静态抽象接口成员。它允许您在接口中定义静态抽象方法(包括运算符)。例如,现在可以实现代数泛型方法。对于某些人来说,此功能将是我们今年提供的绝对出色的改进。它可能是自 Span<T> 以来最重要的新型系统功能。

以下示例采用 IEnumerable<T>,并且由于 T 被约束为 INumber<T>(可能是 INumber<int>),因此能够对所有值求和。

public static T Sum<T>(IEnumerable<T> values)
    where T : INumber<T>
{
    T result = T.Zero;
​
    foreach (var value in values)
    {
        result += value;
    }
​
    return result;
}

这是有效的,因为INumber<T>定义了接口实现者必须满足的各种(静态)运算符重载IAdditionOperators可能是最容易理解的新接口, INumber<T> 本身就是从它派生的。

这一切都由一项新功能提供支持,该功能允许在接口中声明静态抽象成员。这使接口能够公开运算符和其他静态方法,例如 Parse 或 Create,以及由派生类型实现的那些。请参阅我们相关的博客文章了解更多详情!

提到的所有功能都在 .NET 6 预览版中,不支持在生产中使用。我们将不胜感激,对于您使用它们的反馈。我们打算在 .NET 7 中继续发展和改进通用数学功能以及支持它们的运行时和 C# 功能。我们希望对当前体验进行重大更改,这也是新 API 被标记为“在预览中”的部分原因”。

将 API 标记为“预览中”:

https://github.com/dotnet/des...

INumber<T>:

https://github.com/dotnet/run...

运算符重载:

https://docs.microsoft.com/zh...

IAdditionOperators:

https://github.com/dotnet/run...

相关的博客文章:

https://devblogs.microsoft.co...

库:NativeMemory API

我们添加了通过 System.Runtime.InteropServices.NativeMemory 公开的新本机内存分配 API。这些 API 与 malloc、free、realloc 和 calloc C API 等效,还包括用于进行对齐分配的 API。

您可能想知道如何理解这些 API。首先,它们是用于低级代码和算法的低级 API。应用程序开发人员很少会使用这些。考虑这些 API 的另一种方式类似于平台内在API,它们是用于芯片指令的低级 .NET API。这些 API 很相似,但为与内存相关的操作公开了低级 API。

本机内存分配 API:

https://github.com/dotnet/run...

平台内在:

https://github.com/dotnet/des...

库:System.Text.Json 序列化通知

System.Text.Json 序列化程序现在将通知作为(反)序列化操作的一部分公开。它们对于默认值和验证很有用。要使用它们,请在 System.Text.Json.Serialization 命名空间内实现一个或多个接口 IJsonOnDeserialized、IJsonOnDeserializing、IJsonOnSerialized 或 IJsonOnSerializing。

这是一个在 JsonSerializer.Serialize() 和 JsonSerializer.Deserialize() 期间验证的示例,以确保 FirstName 属性不为空。

 public class Person : IJsonOnDeserialized, IJsonOnSerializing
  {
      public string FirstName{ get; set; }
​
      void IJsonOnDeserialized.OnDeserialized() => Validate(); // Call after deserialization
      void IJsonOnSerializing.OnSerializing() => Validate(); // Call before serialization
​
      private void Validate()
      {
          if (FirstName is null)
          {
              throw new InvalidOperationException("The 'FirstName' property cannot be 'null'.");
          }
      }
  }

以前,您需要实现自定义转换器才能实现此功能。

库:System.Text.Json 序列化属性排序

我们还通过 System.Text.Json.Serialization.JsonPropertyOrderAttribute 添加了控制属性序列化顺序的功能。即指定顺序的整数。较小的整数首先被序列化;没有属性的属性的默认排序值为 0。

下面的示例指定 JSON 应按 Id、City、FirstName、LastName 的顺序进行序列化:

public class Person
{
    public string City { get; set; } // No order defined (has the default ordering value of 0)
​
    [JsonPropertyOrder(1)] // Serialize after other properties that have default ordering
    public string FirstName { get; set; }
​
    [JsonPropertyOrder(2)] // Serialize after FirstName
    public string LastName { get; set; }
​
    [JsonPropertyOrder(-1)] // Serialize before other properties that have default ordering
    public int Id { get; set; }
}

以前,序列化顺序是由反射顺序决定的,它既不是确定的,也不会导致特定的所需顺序。

库:使用 System.Text.Json.Utf8JsonWriter“编写原始”JSON

在使用 Utf8JsonWriter 编写 JSON 有效负载时,有时您需要集成“原始”JSON

  • 我有一个想要在网络上写出的字节序列,并且我知道我在做什么(如下面的示例所示)。
  • 我有一个 blob,我认为它代表 JSON 内容并且我想将其封装起来,我需要确保封装及其内部内容保持格式正确。
JsonWriterOptions writerOptions = new() { WriteIndented = true, };
​
using MemoryStream ms = new();
using UtfJsonWriter writer = new(ms, writerOptions);
​
writer.WriteStartObject();
writer.WriteString("dataType", "CalculationResults");
​
writer.WriteStartArray("data");
​
foreach (CalculationResult result in results)
{
    writer.WriteStartObject();
    writer.WriteString("measurement", result.Measurement);
​
    writer.WritePropertyName("value");
    // Write raw JSON numeric value using FormatNumberValue (not defined in the example)
    byte[] formattedValue = FormatNumberValue(result.Value);
    writer.WriteRawValue(formattedValue, skipValidation: true);
​
    writer.WriteEndObject();
}
​
writer.WriteEndArray();
writer.WriteEndObject();

以下是对上述代码(尤其是 FormatNumberValue)正在执行的操作的描述。为了性能,System.Text.Json 在数字为整数时省略小数点/值,如 1.0。基本原理是写入更少的字节有利于性能。在某些情况下,保留十进制值可能很重要,因为消费者将没有小数的数字视为整数,否则视为双精度数。这种新的“原始价值”模型使您可以随时随地进行控制。

集成“原始”JSON:

https://github.com/dotnet/run...

库:JsonSerializer 上的同步流重载

我们向 JsonSerializer 添加了新的同步 API,用于将 JSON 数据序列化和反序列化到流。您可以在以下示例中看到这一点。

using MemoryStream ms = GetMyStream();
MyPoco poco = JsonSerializer.Deserialize<MyPoco>(ms);

通过接受 JsonTypeInfo<T> 或 JsonSerializerContext 实例,这些新的同步 API 包括与新的System.Text.Json 源生成器兼容和可用的重载。

新的同步 API:

https://github.com/dotnet/run...

System.Text.Json 源生成器:

https://devblogs.microsoft.co...

库:删除了 System.Text.Json.Nodes.JsonNode对dynamic的支持

JsonSerializer 中对 C#dynamic类型的支持已被删除。我们在 Preview 4 中添加了dynamic支持,但后来确定是一个糟糕的设计选择,包括使其成为 JsonNode 类型的必需依赖项。

此更改被认为是从 .NET 6 preview到preview standpoint的重大更改,但不是从 .NET 5 到 6。

dynamic:

https://docs.microsoft.com/zh...

重大更改:

https://github.com/dotnet/doc...

库:System.Diagnostics Propagators

在过去的几年里,我们一直在改进对OpenTelemetry的支持。实现强大支持的关键方面之一是确保需要参与遥测生产的所有组件以正确的格式生成网络标头。这真的很难做到,尤其是随着 OpenTelemetry 规范的变化。OpenTelemetry 定义了传播概念来帮助解决这种情况。我们正在采用传播来启用用于标头自定义的通用模型。

更广泛概念的背景:

  • OpenTelemetry规范——分布式跟踪数据结构的内存表示。
  • OpenTelemetry Span — 用于跟踪的构建块,由 .NET 中的System.Diagnostics.Activity 代表。
  • W3C TraceContext — 关于如何通过众所周知的 HTTP 标头传播这些分布式跟踪数据结构的规范。

以下代码演示了使用传播的一般方法。

DistributedContextPropagator propagator = DistributedContextPropagator.Current;
propagator.Inject(activity, carrier, (object theCarrier, string fieldName, string value) =>
{
   // Extract the context from the activity then inject it to the carrier.
});

您还可以选择使用不同的传播器。

// Set the current propagation behavior to not transmit any distributed context information in outbound network messages.
DistributedContextPropagator.Current = DistributedContextPropagator.CreateNoOutputPropagator();

OpenTelemetry:

https://devblogs.microsoft.co...

传播:

https://opentelemetry.lightst...

OpenTelemetry:

https://opentelemetry.io/

OpenTelemetry Span:

https://opentelemetry.lightst...

System.Diagnostics.Activity:

https://docs.microsoft.com/zh...

W3C TraceContext:

https://www.w3.org/TR/trace-c...

DistributedContextPropagator 抽象类确定分布式上下文信息在遍历网络时是否以及如何编码和解码。编码可以通过任何支持键值字符串对的网络协议传输。DistributedContextPropagator 将值注入到载体中并从载体中提取值作为键/值字符串对。通过添加对传播器的支持,我们实现了两件事:

  • 您不再需要使用W3C TraceContext标头。您可以编写自定义传播器(即,使用您自己的标头名称,包括根本不发送它们),而无需 HttpClient、ASP.NET Core 具有此自定义格式的先验知识的库
  • 如果您使用自定义传输(例如消息队列)实现库,则现在可以支持各种连接格式,只要您支持发送和接收文本映射(例如 Dictionary<string, string>)

大多数应用程序代码不需要直接使用此功能,但是,如果您使用 OpenTelemetry,您很可能会在调用堆栈中看到它。如果关心跟踪和因果关系,一些库代码将希望参与此模型。

W3C TraceContext:

https://www.w3.org/TR/trace-c...

库:加密操作的简化调用模式

.NET 加密和解密例程是围绕流设计的,没有定义有效负载何时已经在内存中的真正概念。SymmetricAlgorithm 上新的 Encrypt- 和 Decrypt- 方法加速了内存中已经存在的情况,旨在为调用者和代码审查者提供清晰的信息。此外,它们支持从跨度读取和向跨度写入。

新的简化方法提供了一种使用加密 API 的直接方法:

private static byte[] Decrypt(byte[] key, byte[] iv, byte[] ciphertext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
​
        return aes.DecryptCbc(ciphertext, iv);
    }
}

使用新的 Encrypt- 和 Decrypt-methods,仅使用来自 SymmetricAlgorithm 实例的 key 属性。新的 DecryptCbc 方法支持选择填充算法,但 PKCS#7 经常与 CBC 一起使用,因此它是默认参数。如果您喜欢更清晰,只需指定它:

private static byte[] Decrypt(byte[] key, byte[] iv, byte[] ciphertext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
​
        return aes.DecryptCbc(ciphertext, iv, PaddingMode.PKCS7);
    }
}

您可以看到现有模式(使用 .NET 5)需要更多的管道才能获得相同的结果。

private static byte[] Decrypt(byte[] key, byte[] iv, byte[] ciphertext)
{
    using (Aes aes = Aes.Create())
    {
        aes.Key = key;
        aes.IV = iv;
​
        // These are the defaults, but let's set them anyways.
        aes.Padding = PaddingMode.PKCS7;
        aes.Mode = CipherMode.CBC;
​
        using (MemoryStream destination = new MemoryStream())
        using (ICryptoTransform transform = aes.CreateDecryptor())
        using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
        {
            cryptoStream.Write(ciphertext, 0, ciphertext.Length);
            cryptoStream.FlushFinalBlock();
            return destination.ToArray();
        }
    }
}

库:全局不变模式下的完整案例映射支持

全局不变模式使您能够消除应用程序对全局数据和行为的依赖,以换取较小的应用程序(主要在 Linux 上)。我们改进了全局不变模式以支持完整 Unicode 字符集的大小写映射。以前,此模式仅支持 ASCII 范围字符用于 String.ToUpper、String.ToLower 和字符串比较以及使用IgnoreCase 选项进行搜索等操作。

基于 Alpine 的 .NET 容器镜像是我们默认启用全局环境模式的唯一环境。

全局不变模式:

https://github.com/dotnet/run...

改进了全局不变模式:

https://docs.microsoft.com/zh...

IgnoreCase:

https://docs.microsoft.com/zh...

默认启用全局环境模式:

https://github.com/dotnet/dot...

运行时:W^X(写或执行)支持所有平台和架构

运行时现在有一种模式,它不会同时创建或使用任何可写和可执行的内存页面。所有可执行内存都映射为只读。此功能已在 macOS(适用于 Apple Silicon)上启用。在 Apple Silicon 机器上,同时可写和可执行的内存映射是被禁止的。

此功能现已在所有其他平台上启用和支持,作为可选体验。在这些平台上,可执行代码的生成/修改是通过单独的读写内存映射完成的。这对于 JIT 代码和运行时生成的帮助程序都是没错的。这些映射是在与可执行代码地址不同的虚拟内存地址处创建的,并且仅在执行写入时存在很短的时间。例如,JIT 现在将代码生成到暂存缓冲区中,在整个方法被 JIT之后,使用单个内存复制函数调用将代码复制到可执行内存中。并且可写映射生命周期仅跨越内存复制的时间。

可以通过将环境变量 DOTNET_EnableWriteXorExecute 设置为 1 来启用此新功能。此功能在 .NET 6 中是可选的,因为它有具有启动回归(Apple Silicon 除外)。在我们的 ASP.Net 基准测试中,当使用 Ready To Run (R2R) 编译时,回归约为 10%。但是,在启用和不启用该功能的情况下,测量的稳态性能相同。对于启动性能不重要的应用程序,我们建议启用此功能以提高其提供的安全性。我们打算在 .NET 7 中解决性能回归问题,并在那时默认启用该功能。

运行时:CodeGen 变更日志

在预览版 7 中的代码生成中进行了以下更改。

1.社区PR

以下 PR 均来自@SingleAccrtion

  • 在 32 位目标运行时优化 CAST(int <- long)#53040

https://github.com/dotnet/run...

  • 消除对小类型运行时的链式转换#52561

https://github.com/dotnet/run...

  • 从除法变形运行时中删除一些不需要的代码#53464

https://github.com/dotnet/run...

  • 修复长 muls 运行时变形中的 CQ 回归和正确性错误#53566

https://github.com/dotnet/run...

  • 优化窄存储运行时不要消除 FP 类型的强制转换#53667

https://github.com/dotnet/run...

  • 移动“不要零扩展 setcc”优化以降低运行时间#53778

https://github.com/dotnet/run...

  • 禁用实现定义的强制转换运行时的折叠#53782

https://github.com/dotnet/run...

  • 为 VNF_MapStore 和 VNF_MapSelect 运行时添加 args 描述#54108

https://github.com/dotnet/run...

  • 将 cgt.un(op, 0) 导入为 NE(op, 0) 运行时#54539

https://github.com/dotnet/run...

  • 使用本地断言道具在返回运行时省略强制转换#55632

https://github.com/dotnet/run...

@SingleAccrtion:

https://github.com/SingleAccr...

2.动态PGO

以下 PR 支持动态 PGO 项目

  • [JIT] 改进 inliner:新启发式,依赖 PGO 数据运行时#52708

https://github.com/dotnet/run...

  • 内联:扩展配置调用站点的 IL 限制,允许内联交换机。运行时#55478

https://github.com/dotnet/run...

  • JIT:静态类推导失败时启用GDV。运行时间#55660

https://github.com/dotnet/run...

动态 PGO 项目:

https://github.com/dotnet/run...

3.LSRA

以下 PR 支持LRSA 项目

  • 在定义时溢出单定义变量以避免进一步溢出运行时#54345

https://github.com/dotnet/run...

  • 在 minopts 中将 vars 标记为 do not enreg。运行时#54998

https://github.com/dotnet/run...

LRSA 项目:

https://github.com/dotnet/run...

4.循环优化

以下 PR 改进了循环优化。

  • 改进循环克隆,调试改进运行时#55299

https://github.com/dotnet/run...

  • 支持使用结构索引表达式运行时的数组克隆循环#55612

https://github.com/dotnet/run...

  • 将 RyuJIT 优化的最大循环从 16 增加到 64。runtime#55614

https://github.com/dotnet/run...

以下 PR 改进了结构处理。

  • 在 win x64 上注册结构。运行时间#55045

https://github.com/dotnet/run...

  • Enreg 构建 x86 窗口。运行时间#55535

https://github.com/dotnet/run...

  • 在所有平台上默认启用 StructEnreg。运行时间#55558

https://github.com/dotnet/run...

  • 改进 TryTransformStoreObjAsStoreInd 优化。运行时#55727

https://github.com/dotnet/run...

以下 PR 改进了一般优化。

  • 布尔逻辑中的“==0”优化 #13573 runtime#49548

https://github.com/dotnet/run...

  • 尾调用运行时时允许隐式扩展#54864

https://github.com/dotnet/run...

我们正处于发行版的那个时候,我们考虑完成新功能和改进。干得好,团队。这是另一季 .NET预览的结束。
我们继续希望并依赖您的反馈。我们将把 .NET 6 的其余部分集中在回归(功能和性能)和新功能中发现的错误上。在大多数情况下,功能改进需要等待 .NET 7。请分享您的任何和所有反馈,我们很乐意对其进行分类。
感谢所有为 .NET 6 成为另一个伟大版本做出贡献的人。
感谢您成为 .NET 开发人员。


扫码关注微软MSDN,获取更多微软一手技术信息和官方学习资料!

image.png


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK