Прочитать на английском

Поделиться через


Новые возможности .NET Core 2.1

В .NET Core 2.1 представлены следующие улучшения и новые возможности:

Средства

Пакет SDK .NET Core 2.1 (версия 2.1.300), который входит в комплектацию .NET Core 2.1, включает следующие изменения и усовершенствования.

Повышение производительности сборки.

Основное внимание в .NET Core 2.1 уделено производительности сборки, что позволило сократить требуемое время, особенно для добавочной сборки. Эти улучшения производительности применяются к сборке, выполняемой из командной строки с помощью dotnet build или в Visual Studio. Вот несколько из этих улучшений:

  • при разрешении ресурсов в пакете разрешаются только те ресурсы, которые используются для сборки, а не все;

  • кэширование ссылок на сборки;

  • использование серверов сборки SDK длительного выполнения, которые не завершаются после каждого отдельного вызова dotnet build. Это позволяет не применять JIT-компиляцию для больших блоков кода при каждом вызове dotnet build. Процессы серверов сборки можно автоматически завершить с помощью следующей команды:

    Интерфейс командной строки.NET
    dotnet buildserver shutdown
    

Новые команды интерфейса командной строки

Ряд средств, которые ранее были доступны только для отдельных проектов с использованием DotnetCliToolReference, теперь стали частью пакета SDK для .NET Core. Эти средства включают:

  • dotnet watch предоставляет наблюдатель файловой системы, который ожидает изменений в файле и выполняет для него указанный набор команд. Например, следующая команда автоматически перестраивает текущий проект и выводит подробные результаты при любом изменении файла в проекте:

    Интерфейс командной строки.NET
    dotnet watch -- --verbose build
    

    Обратите внимание на параметр -- перед параметром --verbose. Он отделяет параметры, передаваемые непосредственно в команду dotnet watch, от аргументов для дочернего процесса dotnet. Без него параметр --verbose был бы применен к команде dotnet watch, а не к dotnet build.

    Дополнительные сведения см. в статье Разработка приложений ASP.NET Core с использованием наблюдателя файлов.

  • dotnet dev-certs создает сертификаты, используемые при разработке в приложениях ASP.NET Core, и управляет ими;

  • dotnet user-secrets управляет секретами в хранилище секретов пользователя в приложениях ASP.NET Core;

  • dotnet sql-cache создает в базе данных Microsoft SQL Server таблицу и индексы, которые будут использоваться для распределенного кэширования;

  • dotnet ef выполняет роль средства для управления базами данных, объектами DbContext и миграциями в приложениях Entity Framework Core. Дополнительные сведения см. в описании программ командной строки для EF Core .NET.

Глобальные инструменты

.NET Core 2.1 поддерживает глобальные инструменты, то есть специальные средства, которые доступны глобально из командной строки. Модель расширяемости в предыдущих версиях .NET Core предоставляла пользовательские средства только отдельно для каждого проекта с использованием DotnetCliToolReference.

Чтобы установить глобальные инструменты, выполните команду dotnet tool install. Например:

Интерфейс командной строки.NET
dotnet tool install -g dotnetsay

Установленные инструменты можно запускать из командной строки, указав имя инструмента. См. дополнительные сведения о глобальных инструментах .NET Core.

Управление инструментами с помощью команды dotnet tool

В пакете SDK для .NET Core 2.1 все действия с инструментами выполняются с помощью команды dotnet tool. Имеются следующие варианты:

  • dotnet tool install устанавливает инструмент.

  • dotnet tool update удаляет и переустанавливает инструмент, то есть по сути обновляет его.

  • dotnet tool list выводит список установленных инструментов.

  • dotnet tool uninstall удаляет все установленные инструменты.

Накат

Все приложения .NET Core, начиная с .NET Core версии 2.0, выполняют автоматический накат до последней дополнительной версии, установленной в системе.

Начиная с .NET Core 2.0, если приложение было создано с помощью версии .NET Core, которая отсутствует во время выполнения, приложение автоматически выполняется в самой новой из установленных дополнительных версий .NET Core. Другими словами, если приложение создано с помощью .NET 2.0 Core и выполняется в системе, где отсутствует .NET Core 2.0, но присутствует .NET Core 2.1, это приложение выполняется в .NET Core 2.1.

Важно!

Стратегия наката не применяется к предварительным версиям. По умолчанию она также не применяется к основным версиям, однако это поведение можно изменить с помощью показанных ниже параметров.

С помощью этого параметра вы можете изменить это поведение для выполнения наката при отсутствии подходящей общей платформы. Доступны следующие параметры:

  • 0. Отключает накат для дополнительных версий. Если задано это значение, для приложения для .NET Core 2.0.0 будет выполняться накат до версии .NET Core 2.0.1, но не до версии .NET Core 2.2.0 или .NET Core 3.0.0.
  • 1. Включает накат для дополнительных версий. Это значение параметра по умолчанию. Если задано это значение, для приложения для .NET Core 2.0.0 будет выполняться накат либо до версии .NET Core 2.0.1, либо до версии .NET Core 2.2.0 (в зависимости от установленной версии), но не до версии .NET Core 3.0.0.
  • 2. Включает накат для дополнительных и основных версий. Если установлено это значение, учитываются разные основные версии, поэтому для приложения для .NET Core 2.0.0 будет выполняться накат до версии .NET Core 3.0.0.

Этот параметр можно изменить любым из трех способов:

  • Присвоить нужное значение переменной среды DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX.

  • Добавить следующую строку с нужным значением в файл .runtimeconfig.json:

    JSON
    "rollForwardOnNoCandidateFx" : 0
    
  • При использовании .NET CLI добавьте следующий параметр с требуемым значением в команду .NET, runнапример:

    Интерфейс командной строки.NET
    dotnet run --rollForwardOnNoCandidateFx=0
    

Накат версий исправлений выполняется независимо от значения этого параметра после применения любых потенциальных дополнительных или основных версий.

Развертывание

Обслуживание автономного приложения

Теперь dotnet publish публикует автономные приложения с обслуживаемой версией среды выполнения. При публикации автономного приложения с помощью пакета SDK для .NET Core 2.1 (версия 2.1.300) такое приложение использует самую последнюю обслуживаемую версию среды выполнения, известную этому пакету SDK. После обновления до последнего выпуска пакета SDK публикация выполняется с использованием последней версии среды выполнения .NET Core. Это применимо для сред выполнения .NET Core 1.0 и более поздних версий.

Локальная публикация зависит от версий среды выполнения на NuGet.org. На компьютере не требуется обслуживать среду выполнения.

Если используется пакет SDK 2.0 для .NET Core, автономные приложения публикуются с помощью среды выполнения .NET Core 2.0.0, если в свойстве RuntimeFrameworkVersion не указана другая версия. Такое поведение позволяет не устанавливать это свойство, когда нужно выбрать более позднюю версию среды выполнения для автономного приложения. Для перехода к новой версии проще всего опубликовать приложение с пакетом SDK для .NET Core 2.1 (версия 2.1.300).

Дополнительные сведения см. в статье Обновление версии среды выполнения автономного развертывания.

пакет обеспечения совместимости с Windows;

При переносе существующего кода с платформы .NET Framework на .NET Core вы можете использовать пакет обеспечения совместимости с Windows. Он предоставляет доступ к 20 000 дополнительных интерфейсов API, которые не поддерживаются в .NET Core. Сюда входят такие API-интерфейсы, как пространство имен System.Drawing, класс EventLog, инструментарий WMI, счетчики производительности, службы Windows, типы и члены реестра Windows.

Усовершенствования JIT-компилятора

.NET Core теперь включает новую технологию JIT-компиляции, которая называется многоуровневая компиляция (или адаптивная оптимизация), что позволяет значительно повысить производительность. Многоуровневая компиляции включается пользователем.

Одна из важных задач, которую выполняет JIT-компилятор, это оптимизация выполнения кода. Но для редко используемых путей кода компилятор может потратить на оптимизацию больше времени, чем потребуется на выполнение неоптимизированного кода. Многоуровневая компиляция разделяет JIT-компиляцию на два уровня.

  • Первый уровень создает код настолько быстро, насколько это возможно.

  • Второй уровень создает оптимизированный код для тех методов, которые выполняются часто. Второй уровень компиляции выполняется параллельно, чтобы повысить производительность.

Вы можете выбрать многоуровневую компиляцию двумя способами.

  • Чтобы использовать многоуровневую компиляцию во всех проектах, которые работают с пакетом SDK для 2.1 .NET Core, задайте следующую переменную среды:

    Консоль
    COMPlus_TieredCompilation="1"
    
  • Чтобы использовать многоуровневую компиляцию отдельно для конкретных проектов, добавьте свойство <TieredCompilation> в раздел <PropertyGroup> файла проекта MSBuild, как показано в следующем примере:

    XML
    <PropertyGroup>
        <!-- other property definitions -->
    
        <TieredCompilation>true</TieredCompilation>
    </PropertyGroup>
    

Изменения API

Span<T> и Memory<T>.

.NET Core 2.1 включает несколько новых типов, которые значительно повышают эффективность работы с массивами и другими типами памяти. Новые типы включают:

Без этих типов при передаче таких элементов в составе массива или в сегменте буфера памяти необходимо создавать копию данных перед их передачей в метод. Эти типы обеспечивают виртуальное представление данных, что позволяет не выделять дополнительную память и не выполнять дополнительные операции копирования.

В следующем примере экземпляр Span<T> и Memory<T> используется для создания виртуального представления 10 элементов массива.

C#
using System;

class Program
{
    static void Main()
    {
        int[] numbers = new int[100];
        for (int i = 0; i < 100; i++)
        {
            numbers[i] = i * 2;
        }

        var part = new Span<int>(numbers, start: 10, length: 10);
        foreach (var value in part)
            Console.Write($"{value}  ");
    }
}
// The example displays the following output:
//     20  22  24  26  28  30  32  34  36  38

Сжатие Brotli

В .NET Core 2.1 добавлена поддержка сжатия и распаковки Brotli. Brotli — это универсальный алгоритм сжатия данных без потерь, который определен в RFC 7932 и поддерживается большинством веб-браузеров и всеми основными веб-серверами. Вы можете использовать потоковый класс System.IO.Compression.BrotliStream или высокопроизводительные классы System.IO.Compression.BrotliEncoder и System.IO.Compression.BrotliDecoder на основе диапазонов. Следующий пример демонстрирует сжатие с применением класса BrotliStream.

C#
public static Stream DecompressWithBrotli(Stream toDecompress)
{
    MemoryStream decompressedStream = new MemoryStream();
    using (BrotliStream decompressionStream = new BrotliStream(toDecompress, CompressionMode.Decompress))
    {
        decompressionStream.CopyTo(decompressedStream);
    }
    decompressedStream.Position = 0;
    return decompressedStream;
}

BrotliStream действует так же, как DeflateStream и GZipStream, что позволяет легко преобразовать в BrotliStream код, вызывающий эти API-интерфейсы.

Новые улучшения и API криптографии

.NET Core 2.1 включает многочисленные улучшения API криптографии:

  • System.Security.Cryptography.Pkcs.SignedCms доступно в пакете System.Security.Cryptography.Pkcs. Реализация здесь такая же, как и в классе SignedCms для .NET Framework.

  • Новые перегрузки методов X509Certificate.GetCertHash и X509Certificate.GetCertHashString принимают идентификатор хэш-алгоритма, чтобы вызывающие методы могли получать значения отпечатка сертификата с алгоритмами, отличными от SHA-1.

  • Доступен новый API криптографии на основе Span<T>, который поддерживает хэширование, HMAC, криптографический генератор случайных чисел, генератор асимметричной подписи, обработку асимметричной подписи и шифрование RSA.

  • Производительность System.Security.Cryptography.Rfc2898DeriveBytes улучшена примерно на 15 % благодаря реализации на основе Span<T>.

  • Новый класс System.Security.Cryptography.CryptographicOperations включает два новых метода:

    • FixedTimeEquals выполняется в течение строго фиксированного промежутка времени для любых входных параметров одинаковой длины, что очень удобно для использования в криптографической проверке без добавления информации о времени работы стороннего канала.

    • Процедура ZeroMemory выполняет очистку памяти и не может быть оптимизирована.

  • Статический метод RandomNumberGenerator.Fill заполняет Span<T> случайными значениями.

  • Теперь System.Security.Cryptography.Pkcs.EnvelopedCms поддерживается в macOS и Linux.

  • Эллиптические кривые Диффи—Хелмана (ECDH) теперь доступны в семействе классов System.Security.Cryptography.ECDiffieHellman. Контактная зона сохраняется такой же, как в .NET Framework.

  • Экземпляр, возвращаемый RSA.Create, умеет шифровать и расшифровывать данные с помощью OAEP и хэш-кода SHA-2, а также создавать и проверять подписи с помощью RSA-PSS.

Улучшения для сокетов

.NET Core включает новый тип System.Net.Http.SocketsHttpHandler и переработанный System.Net.Http.HttpMessageHandler, которые создают основу для сетевых API-интерфейсов более высокого уровня. Например, System.Net.Http.SocketsHttpHandler является основой для реализации HttpClient. В предыдущих версиях .NET Core API-интерфейсы более высокого уровня основывались на собственных реализациях сетевых служб.

Реализация сокетов, добавленная в .NET Core 2.1 имеет ряд преимуществ:

  • Значительное улучшение производительности по сравнению с предыдущей реализацией.

  • Устранение зависимостей платформы, что упрощает развертывание и обслуживание.

  • Согласованное поведение на всех платформах .NET Core.

SocketsHttpHandler является реализацией по умолчанию в .NET Core 2.1. Но вы можете настроить в приложении использование более старой версии класса HttpClientHandler, вызвав метод AppContext.SetSwitch:

C#
AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);

Можно также использовать переменную среды, чтобы отказаться от использования реализации сокетов на основе SocketsHttpHandler. Для этого задайте для свойства DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER значение false или 0.

В Windows можно использовать также System.Net.Http.WinHttpHandler, чтобы использовать собственную реализацию, или класс SocketsHttpHandler, передав экземпляр этого класса в конструктор HttpClient.

В macOS и Linux вы можете настроить HttpClient только отдельно для каждого процесса. В Linux необходимо развернуть libcurl, если вы хотите использовать старую реализацию HttpClient. (Она устанавливается вместе с .NET Core 2.0.)

Критические изменения

Дополнительные сведения о критических изменениях для перехода с версии 2.0 на 2.1 см. в этой статье.

См. также