Вроде бы только недавно вышла 6 версия .NET. И вот уже доступна для загрузки первая предварительная версия .NET 7. Коротко рассмотрим все новинки этой версии, а в завершении будут приведены ссылки на полные анонсы. |
.NET 7 будет "текущей" (current) версией. Это значит что поддержка финальной версии продлится 18 месяцев после даты её выхода.
Для работы с .NET 7 Preview 1 рекомендуется использовать Visual Studio 2022 7.2 Preview 1 или более новую версию. Поддержка .NET 7 в Visual Studio for Mac в данный момент отсутствует.
Где скачать?
.NET 7 Preview 1
.NET 7 как целевая платформа (target framework)
Для того, чтобы проект был нацелен на использование .NET 7 необходимо указать соответствующее значение TargetFramework в его настройках:
<TargetFramework>net7.0</TargetFramework>
Кроме того, определены TargetFramework, для конкретных операционных систем:
- net7.0-android
- net7.0-ios
- net7.0-maccatalyst
- net7.0-macos
- net7.0-tvos
- net7.0-windows
Поддержка ссылочных типов, допускающих значение null, в библиотеках Microsoft.Extensions.*
Аннотации для поддержки ссылочных типов, допускающих значение null, были добавлены в следующие библиотеки:
- Microsoft.Extensions.DependencyInjection.Abstractions
- Microsoft.Extensions.Logging.Abstractions
- Microsoft.Extensions.Primitives
- Microsoft.Extensions.FileSystemGlobbing
- Microsoft.Extensions.DependencyModel
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.FileProviders.Abstractions
- Microsoft.Extensions.FileProviders.Physical
- Microsoft.Extensions.Configuration
- Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.CommandLine
- Microsoft.Extensions.Configuration.EnvironmentVariables
- Microsoft.Extensions.Configuration.FileExtensions
- Microsoft.Extensions.Configuration.Ini
- Microsoft.Extensions.Configuration.Json
Изменения в ActivityContext
- Появилась перегрузка для ActivityContext.TryParse(…), которая позволяет создавать ActivityContext с использованием контекста, полученного с удаленного родителя.
- Добавлен метод Activity.IsStopped() позволяет определить остановлен ли данный объект Activity.
Изменения в System.Text.Json
- Предоставлен доступ к экземпляру JsonSerializerOptions, используемому по-умолчанию.
- Добавлено свойство JsonWriterOptions.MaxDepth.
- В System.Net.Http.Json добавлена поддержка PATCH (метод PatchAsJsonAsync(…)).
CodeGen
В .NET 7 Preview 1 вошло достаточно много изменений кодогенерации, полный список которых доступен в полном анонсе.
p/Invoke
p/Invoke это технология для обращения к неуправляемому коду из управляемого. В .NET 7 Preview 1 появился генератор p/Invoke кода: для методов, которые отмечены атрибутом [LibraryImport] и испол��зуются для вызова методов из неуправляемого кода, необходимый p/Invoke код будет создан автоматически.
[LibraryImport("NativeBinary")]
internal static partial int Sum(int a, int b);
Кроме того, разработчики .NET обещают что данная функциональность будет доступна в виде отдельного инструмента вне .NET 7.
Улучшения горячей перезагрузки кода (hot reload)
Теперь поддерживается горячая перезагрузка кода в следующих сценариях:
- добавление статической лямбды в существующий метода;
- добавление лямбды, захватывающей существующий метод, который захвачен хотя бы одной уже существующей лямбдой;
- добавление статических или не виртуальных методов в существующий класс;
- добавление статических полей в существующий класс;
- добавление новых классов.
ASP.NET Core в .NET 7 Preview 1
Улучшения Minimal API
Для работы с загруженными файлами в .NET 7 появились интерфейсы IFormFile и IFormFileCollection:
app.MapPost("/upload", async(IFormFile file) =>
{
using var stream = File.OpenWrite("upload.txt");
await file.CopyToAsync(stream);
});
app.MapPost("/upload", async (IFormFileCollection myFiles) => { … });
Тело запроса можно получить как Stream или PipeReader:
app.MapPost("/add", async (Stream body, CancellationToken ct) => { … });
Стоит учесть, что полученный Stream можно прочитать только один раз (без перемотки назад) и он доступен только в теле обработчика Minimal API.
Для настройки JSON в Minimal API добавлен метод ConfigureRouteHandlerJsonOptions(…).
builder.Services.ConfigureRouteHandlerJsonOptions(options => {…});
SignalR
В SignalR появился генератор для создания клиентского C# кода на основе интерфейсов хабов.
MVC и Razor Pages
- Представления MVC и Razor Pages теперь поддерживают ссылочные типы, допускающие значение null, в качестве моделей страниц.
- Теперь в ModelErrorDictionary могут быть добавлены имена свойств JSON объекта при ошибки валидации:
services.AddControllers(options =>
{
options.ModelMetadataDetailsProviders.Add(new SystemTextJsonValidationMetadataProvider())
});
dotnet watch
- dotnet watch теперь использует эмоджи при выводе на консоль.
- dotnet watch можно настроить на автоматический перезапуск если после изменения кода невозможно применить горячую перезагрузку (hot reload). Для этого нужно установить переменную среды DOTNET_WATCH_RESTART_ON_RUDE_EDIT в значение true.
Blazor
В Blazor в атрибутах валидации можно получить необходимые сервисы используя ValidationContext.GetRequiredService<TService>().
HTTP, HTTP/2 и HTTP/3
Оптимизирована скорость обработки и записи заголовков.
gRPC
Сервис перекодирования gRPC JSON позволяет обращаться к gRPC сервису используя стандартные HTTP запросы. Подробности и примеры можно посмотреть на GitHub.
Entity Framework Core 7 Preview 1
В Entity Framework Core 7 Preview 1 исправлено более 80 известных проблем. О каких-то новых возможностях разработчики не сообщают.
Ссылки
Полные описания нововведений можно найти по следующим ссылкам:
Кроме того, доступна следующая дополнительная информация: