Новые возможности .NET Core 2.1What's new in .NET Core 2.1

В .NET Core 2.1 представлены следующие улучшения и новые возможности:.NET Core 2.1 includes enhancements and new features in the following areas:

ИнструментарийTooling

Пакет SDK .NET Core 2.1 (версия 2.1.300), который входит в комплектацию .NET Core 2.1, включает следующие изменения и усовершенствования.The .NET Core 2.1 SDK (v 2.1.300), the tooling included with .NET Core 2.1, includes the following changes and enhancements:

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

Основное внимание в .NET Core 2.1 уделено производительности сборки, что позволило сократить требуемое время, особенно для добавочной сборки.A major focus of .NET Core 2.1 is improving build-time performance, particularly for incremental builds. Эти улучшения производительности применяются к сборке, выполняемой из командной строки с помощью dotnet build или в Visual Studio.These performance improvements apply to both command-line builds using dotnet build and to builds in Visual Studio. Вот несколько из этих улучшений:Some individual areas of improvement include:

  • при разрешении ресурсов в пакете разрешаются только те ресурсы, которые используются для сборки, а не все;For package asset resolution, resolving only assets used by a build rather than all assets.

  • кэширование ссылок на сборки;Caching of assembly references.

  • использование серверов сборки SDK длительного выполнения, которые не завершаются после каждого отдельного вызова dotnet build.Use of long-running SDK build servers, which are processes that span across individual dotnet build invocations. Это позволяет не применять JIT-компиляцию для больших блоков кода при каждом вызове dotnet build.They eliminate the need to JIT-compile large blocks of code every time dotnet build is run. Процессы серверов сборки можно автоматически завершить с помощью следующей команды:Build server processes can be automatically terminated with the following command:

    dotnet buildserver shutdown
    

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

Ряд средств, которые ранее были доступны только для отдельных проектов с использованием DotnetCliToolReference, теперь стали частью пакета SDK для .NET Core.A number of tools that were available only on a per project basis using DotnetCliToolReference are now available as part of the .NET Core SDK. К ним относятся следующие средства:These tools include:

  • dotnet watch предоставляет наблюдатель файловой системы, который ожидает изменений в файле и выполняет для него указанный набор команд.dotnet watch provides a file system watcher that waits for a file to change before executing a designated set of commands. Например, следующая команда автоматически перестраивает текущий проект и выводит подробные результаты при любом изменении файла в проекте:For example, the following command automatically rebuilds the current project and generates verbose output whenever a file in it changes:

    dotnet watch -- --verbose build
    

    Обратите внимание на параметр -- перед параметром --verbose.Note the -- option that precedes the --verbose option. Он отделяет параметры, передаваемые непосредственно в команду dotnet watch, от аргументов для дочернего процесса dotnet.It delimits the options passed directly to the dotnet watch command from the arguments that are passed to the child dotnet process. Без него параметр --verbose был бы применен к команде dotnet watch, а не к dotnet build.Without it, the --verbose option applies to the dotnet watch command, not the dotnet build command.

    Подробнее см. Разработка приложений ASP.NET Core с использованием dotnet watch;For more information, see Develop ASP.NET Core apps using dotnet watch

  • dotnet dev-certs создает сертификаты, используемые при разработке в приложениях ASP.NET Core, и управляет ими;dotnet dev-certs generates and manages certificates used during development in ASP.NET Core applications.

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

  • dotnet sql-cache создает в базе данных Microsoft SQL Server таблицу и индексы, которые будут использоваться для распределенного кэширования;dotnet sql-cache creates a table and indexes in a Microsoft SQL Server database to be used for distributed caching.

  • dotnet ef выполняет роль средства для управления базами данных, объектами DbContext и миграциями в приложениях Entity Framework Core.dotnet ef is a tool for managing databases, DbContext objects, and migrations in Entity Framework Core applications. Дополнительные сведения см. в описании программ командной строки для EF Core .NET.For more information, see EF Core .NET Command-line Tools.

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

.NET Core 2.1 поддерживает глобальные инструменты, то есть специальные средства, которые доступны глобально из командной строки..NET Core 2.1 supports Global Tools -- that is, custom tools that are available globally from the command line. Модель расширяемости в предыдущих версиях .NET Core предоставляла пользовательские средства только отдельно для каждого проекта с использованием DotnetCliToolReference.The extensibility model in previous versions of .NET Core made custom tools available on a per project basis only by using DotnetCliToolReference.

Чтобы установить глобальные инструменты, выполните команду dotnet tool install.To install a Global Tool, you use the dotnet tool install command. Например:For example:

dotnet tool install -g dotnetsay

Установленные инструменты можно запускать из командной строки, указав имя инструмента.Once installed, the tool can be run from the command line by specifying the tool name. См. дополнительные сведения о глобальных инструментах .NET Core.For more information, see .NET Core Global Tools overview.

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

В пакете SDK для .NET Core 2.1 все действия с инструментами выполняются с помощью команды dotnet tool.In .NET Core 2.1 SDK, all tools operations use the dotnet tool command. Доступны следующие параметры.The following options are available:

НакатRoll forward

Все приложения .NET Core, начиная с .NET Core версии 2.0, выполняют автоматический накат до последней дополнительной версии, установленной в системе.All .NET Core applications starting with .NET Core 2.0 automatically roll forward to the latest minor version installed on a system.

Начиная с .NET Core 2.0, если приложение было создано с помощью версии .NET Core, которая отсутствует во время выполнения, приложение автоматически выполняется в самой новой из установленных дополнительных версий .NET Core.Starting with .NET Core 2.0, if the version of .NET Core that an application was built with is not present at runtime, the application automatically runs against the latest installed minor version of .NET Core. Другими словами, если приложение создано с помощью .NET 2.0 Core и выполняется в системе, где отсутствует .NET Core 2.0, но присутствует .NET Core 2.1, это приложение выполняется в .NET Core 2.1.In other words, if an application is built with .NET Core 2.0, and .NET Core 2.0 is not present on the host system but .NET Core 2.1 is, the application runs with .NET Core 2.1.

Важно!

Стратегия наката не применяется к предварительным версиям.This roll-forward behavior doesn't apply to preview releases. По умолчанию она также не применяется к основным версиям, однако это поведение можно изменить с помощью показанных ниже параметров.By default, it also doesn't apply to major releases, but this can be changed with the settings below.

С помощью этого параметра вы можете изменить это поведение для выполнения наката при отсутствии подходящей общей платформы.You can modify this behavior by changing the setting for the roll-forward on no candidate shared framework. Доступные параметры:The available settings are:

  • 0. Отключает накат для дополнительных версий.0 - disable minor version roll-forward behavior. Если задано это значение, для приложения для .NET Core 2.0.0 будет выполняться накат до версии .NET Core 2.0.1, но не до версии .NET Core 2.2.0 или .NET Core 3.0.0.With this setting, an application built for .NET Core 2.0.0 will roll forward to .NET Core 2.0.1, but not to .NET Core 2.2.0 or .NET Core 3.0.0.
  • 1. Включает накат для дополнительных версий.1 - enable minor version roll-forward behavior. Это значение параметра по умолчанию.This is the default value for the setting. Если задано это значение, для приложения для .NET Core 2.0.0 будет выполняться накат либо до версии .NET Core 2.0.1, либо до версии .NET Core 2.2.0 (в зависимости от установленной версии), но не до версии .NET Core 3.0.0.With this setting, an application built for .NET Core 2.0.0 will roll forward to either .NET Core 2.0.1 or .NET Core 2.2.0, depending on which one is installed, but it will not roll forward to .NET Core 3.0.0.
  • 2. Включает накат для дополнительных и основных версий.2 - enable minor and major version roll-forward behavior. Если установлено это значение, учитываются разные основные версии, поэтому для приложения для .NET Core 2.0.0 будет выполняться накат до версии .NET Core 3.0.0.If set, even different major versions are considered, so an application built for .NET Core 2.0.0 will roll forward to .NET Core 3.0.0.

Этот параметр можно изменить любым из трех способов:You can modify this setting in any of three ways:

  • Присвоить нужное значение переменной среды DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX.Set the DOTNET_ROLL_FORWARD_ON_NO_CANDIDATE_FX environment variable to the desired value.

  • Добавить следующую строку с нужным значением в файл runtimeconfig.json:Add the following line with the desired value to the runtimeconfig.json file:

    "rollForwardOnNoCandidateFx" : 0
    
  • При использовании средств интерфейса командной строки .NET Core включить следующий параметр с нужным значением помощью команды .NET Core, например run:When using .NET Core CLI tools, add the following option with the desired value to a .NET Core command such as run:

    dotnet run --rollForwardOnNoCandidateFx=0
    

Накат версий исправлений выполняется независимо от значения этого параметра после применения любых потенциальных дополнительных или основных версий.Patch version roll forward is independent of this setting and is done after any potential minor or major version roll forward is applied.

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

Обслуживание автономного приложенияSelf-contained application servicing

Теперь dotnet publish публикует автономные приложения с обслуживаемой версией среды выполнения.dotnet publish now publishes self-contained applications with a serviced runtime version. При публикации автономного приложения с помощью пакета SDK для .NET Core 2.1 (версия 2.1.300) такое приложение использует самую последнюю обслуживаемую версию среды выполнения, известную этому пакету SDK.When you publish a self-contained application with the .NET Core 2.1 SDK (v 2.1.300), your application includes the latest serviced runtime version known by that SDK. После обновления до последнего выпуска пакета SDK публикация выполняется с использованием последней версии среды выполнения .NET Core.When you upgrade to the latest SDK, you’ll publish with the latest .NET Core runtime version. Это применимо для сред выполнения .NET Core 1.0 и более поздних версий.This applies for .NET Core 1.0 runtimes and later.

Автономная публикации зависит от версии среды выполнения в NuGet.org. Вам не нужно иметь обслуживаемую среду выполнения на локальном компьютере.Self-contained publishing relies on runtime versions on NuGet.org. You do not need to have the serviced runtime on your machine.

Если используется пакет SDK 2.0 для .NET Core, автономные приложения публикуются с помощью среды выполнения .NET Core 2.0.0, если в свойстве RuntimeFrameworkVersion не указана другая версия.Using the .NET Core 2.0 SDK, self-contained applications are published with the .NET Core 2.0.0 runtime unless a different version is specified via the RuntimeFrameworkVersion property. Такое поведение позволяет не устанавливать это свойство, когда нужно выбрать более позднюю версию среды выполнения для автономного приложения.With this new behavior, you’ll no longer need to set this property to select a higher runtime version for a self-contained application. Для перехода к новой версии проще всего опубликовать приложение с пакетом SDK для .NET Core 2.1 (версия 2.1.300).The easiest approach going forward is to always publish with .NET Core 2.1 SDK (v 2.1.300).

Дополнительные сведения см. в статье Обновление версии среды выполнения автономного развертывания.For more information, see Self-contained deployment runtime roll forward.

Пакет обеспечения совместимости с WindowsWindows Compatibility Pack

При переносе существующего кода с платформы .NET Framework на .NET Core вы можете использовать пакет обеспечения совместимости с Windows.When you port existing code from the .NET Framework to .NET Core, you can use the Windows Compatibility Pack. Он предоставляет доступ к 20 000 дополнительных интерфейсов API, которые не поддерживаются в .NET Core.It provides access to 20,000 more APIs than are available in .NET Core. Сюда входят такие API-интерфейсы, как пространство имен System.Drawing, класс EventLog, инструментарий WMI, счетчики производительности, службы Windows, типы и члены реестра Windows.These APIs include types in the System.Drawing namespace, the EventLog class, WMI, Performance Counters, Windows Services, and the Windows registry types and members.

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

.NET Core теперь включает новую технологию JIT-компиляции, которая называется многоуровневая компиляция (или адаптивная оптимизация), что позволяет значительно повысить производительность..NET Core incorporates a new JIT compiler technology called tiered compilation (also known as adaptive optimization) that can significantly improve performance. Многоуровневая компиляции включается пользователем.Tiered compilation is an opt-in setting.

Одна из важных задач, которую выполняет JIT-компилятор, это оптимизация выполнения кода.One of the important tasks performed by the JIT compiler is optimizing code execution. Но для редко используемых путей кода компилятор может потратить на оптимизацию больше времени, чем потребуется на выполнение неоптимизированного кода.For little-used code paths, however, the compiler may spend more time optimizing code than the runtime spends running unoptimized code. Многоуровневая компиляция разделяет JIT-компиляцию на два уровня.Tiered compilation introduces two stages in JIT compilation:

  • Первый уровень создает код настолько быстро, насколько это возможно.A first tier, which generates code as quickly as possible.

  • Второй уровень создает оптимизированный код для тех методов, которые выполняются часто.A second tier, which generates optimized code for those methods that are executed frequently. Второй уровень компиляции выполняется параллельно, чтобы повысить производительность.The second tier of compilation is performed in parallel for enhanced performance.

Вы можете включить многоуровневую компиляцию одним из двух способов.You can opt into tiered compilation in either of two ways.

  • Чтобы использовать многоуровневую компиляцию во всех проектах, которые работают с пакетом SDK для 2.1 .NET Core, задайте следующую переменную среды:To use tiered compilation in all projects that use the .NET Core 2.1 SDK, set the following environment variable:

    COMPlus_TieredCompilation="1"
    
  • Чтобы использовать многоуровневую компиляцию отдельно для конкретных проектов, добавьте свойство <TieredCompilation> в раздел <PropertyGroup> файла проекта MSBuild, как показано в следующем примере:To use tiered compilation on a per-project basis, add the <TieredCompilation> property to the <PropertyGroup> section of the MSBuild project file, as the following example shows:

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

Изменения APIAPI changes

Span<T> и Memory<T>Span<T> and Memory<T>

.NET Core 2.1 включает несколько новых типов, которые значительно повышают эффективность работы с массивами и другими типами памяти..NET Core 2.1 includes some new types that make working with arrays and other types of memory much more efficient. Новые типы включают:The new types include:

Без этих типов при передаче таких элементов в составе массива или в сегменте буфера памяти необходимо создавать копию данных перед их передачей в метод.Without these types, when passing such items as a portion of an array or a section of a memory buffer, you have to make a copy of some portion of the data before passing it to a method. Эти типы обеспечивают виртуальное представление данных, что позволяет не выделять дополнительную память и не выполнять дополнительные операции копирования.These types provide a virtual view of that data that eliminates the need for the additional memory allocation and copy operations.

В следующем примере экземпляр Span<T> и Memory<T> используется для создания виртуального представления 10 элементов массива.The following example uses a Span<T> and Memory<T> instance to provide a virtual view of 10 elements of an array.

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
Module Program
    Sub Main()
        Dim numbers As Integer() = New Integer(99) {}

        For i As Integer = 0 To 99
            numbers(i) = i * 2
        Next

        Dim part = New Memory(Of Integer)(numbers, start:=10, length:=10)

        For Each value In part.Span
            Console.Write($"{value}  ")
        Next
    End Sub
End Module
' The example displays the following output:
'     20  22  24  26  28  30  32  34  36  38

Сжатие BrotliBrotli compression

В .NET Core 2.1 добавлена поддержка сжатия и распаковки Brotli..NET Core 2.1 adds support for Brotli compression and decompression. Brotli — это универсальный алгоритм сжатия данных без потерь, который определен в RFC 7932 и поддерживается большинством веб-браузеров и всеми основными веб-серверами.Brotli is a general-purpose lossless compression algorithm that is defined in RFC 7932 and is supported by most web browsers and major web servers. Вы можете использовать потоковый класс System.IO.Compression.BrotliStream или высокопроизводительные классы System.IO.Compression.BrotliEncoder и System.IO.Compression.BrotliDecoder на основе диапазонов.You can use the stream-based System.IO.Compression.BrotliStream class or the high-performance span-based System.IO.Compression.BrotliEncoder and System.IO.Compression.BrotliDecoder classes. Следующий пример демонстрирует сжатие с применением класса BrotliStream.The following example illustrates compression with the BrotliStream class:

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-интерфейсы.The BrotliStream behavior is the same as DeflateStream and GZipStream, which makes it easy to convert code that calls these APIs to BrotliStream.

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

.NET Core 2.1 включает многочисленные улучшения API криптографии:.NET Core 2.1 includes numerous enhancements to the cryptography APIs:

  • System.Security.Cryptography.Pkcs.SignedCms доступно в пакете System.Security.Cryptography.Pkcs.System.Security.Cryptography.Pkcs.SignedCms is available in the System.Security.Cryptography.Pkcs package. Реализация здесь такая же, как и в классе SignedCms для .NET Framework.The implementation is the same as the SignedCms class in the .NET Framework.

  • Новые перегрузки методов X509Certificate.GetCertHash и X509Certificate.GetCertHashString принимают идентификатор хэш-алгоритма, чтобы вызывающие методы могли получать значения отпечатка сертификата с алгоритмами, отличными от SHA-1.New overloads of the X509Certificate.GetCertHash and X509Certificate.GetCertHashString methods accept a hash algorithm identifier to enable callers to get certificate thumbprint values using algorithms other than SHA-1.

  • Доступен новый API криптографии на основе Span<T>, который поддерживает хэширование, HMAC, криптографический генератор случайных чисел, генератор асимметричной подписи, обработку асимметричной подписи и шифрование RSA.New Span<T>-based cryptography APIs are available for hashing, HMAC, cryptographic random number generation, asymmetric signature generation, asymmetric signature processing, and RSA encryption.

  • Производительность System.Security.Cryptography.Rfc2898DeriveBytes улучшена примерно на 15 % благодаря реализации на основе Span<T>.The performance of System.Security.Cryptography.Rfc2898DeriveBytes has improved by about 15% by using a Span<T>-based implementation.

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

    • FixedTimeEquals выполняется в течение строго фиксированного промежутка времени для любых входных параметров одинаковой длины, что очень удобно для использования в криптографической проверке без добавления информации о времени работы стороннего канала.FixedTimeEquals takes a fixed amount of time to return for any two inputs of the same length, which makes it suitable for use in cryptographic verification to avoid contributing to timing side-channel information.

    • Процедура ZeroMemory выполняет очистку памяти и не может быть оптимизирована.ZeroMemory is a memory-clearing routine that cannot be optimized.

  • Статический метод RandomNumberGenerator.Fill заполняет Span<T> случайными значениями.The static RandomNumberGenerator.Fill method fills a Span<T> with random values.

  • Теперь System.Security.Cryptography.Pkcs.EnvelopedCms поддерживается в maxOS и Linux.The System.Security.Cryptography.Pkcs.EnvelopedCms is now supported on Linux and maxOS.

  • Эллиптические кривые Диффи—Хелмана (ECDH) теперь доступны в семействе классов System.Security.Cryptography.ECDiffieHellman.Elliptic-Curve Diffie-Hellman (ECDH) is now available in the System.Security.Cryptography.ECDiffieHellman class family. Контактная зона сохраняется такой же, как в .NET Framework.The surface area is the same as in the .NET Framework.

  • Экземпляр, возвращаемый RSA.Create, умеет шифровать и расшифровывать данные с помощью OAEP и хэш-кода SHA-2, а также создавать и проверять подписи с помощью RSA-PSS.The instance returned by RSA.Create can encrypt or decrypt with OAEP using a SHA-2 digest, as well as generate or validate signatures using RSA-PSS.

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

.NET Core включает новый тип System.Net.Http.SocketsHttpHandler и переработанный System.Net.Http.HttpMessageHandler, которые создают основу для сетевых API-интерфейсов более высокого уровня..NET Core includes a new type, System.Net.Http.SocketsHttpHandler, and a rewritten System.Net.Http.HttpMessageHandler, that form the basis of higher-level networking APIs. Например, System.Net.Http.SocketsHttpHandler является основой для реализации HttpClient.System.Net.Http.SocketsHttpHandler, for example, is the basis of the HttpClient implementation. В предыдущих версиях .NET Core API-интерфейсы более высокого уровня основывались на собственных реализациях сетевых служб.In previous versions of .NET Core, higher-level APIs were based on native networking implementations.

Реализация сокетов, добавленная в .NET Core 2.1 имеет ряд преимуществ:The sockets implementation introduced in .NET Core 2.1 has a number of advantages:

  • Значительное улучшение производительности по сравнению с предыдущей реализацией.A significant performance improvement when compared with the previous implementation.

  • Устранение зависимостей платформы, что упрощает развертывание и обслуживание.Elimination of platform dependencies, which simplifies deployment and servicing.

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

SocketsHttpHandler является реализацией по умолчанию в .NET Core 2.1.SocketsHttpHandler is the default implementation in .NET Core 2.1. Но вы можете настроить в приложении использование более старой версии класса HttpClientHandler, вызвав метод AppContext.SetSwitch:However, you can configure your application to use the older HttpClientHandler class by calling the AppContext.SetSwitch method:

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

Можно также использовать переменную среды, чтобы отказаться от использования реализации сокетов на основе SocketsHttpHandler.You can also use an environment variable to opt out of using sockets implementations based on SocketsHttpHandler. Для этого задайте для свойства DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER значение false или 0.To do this, set the DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER to either false or 0.

В Windows можно использовать также System.Net.Http.WinHttpHandler, чтобы использовать собственную реализацию, или класс SocketsHttpHandler, передав экземпляр этого класса в конструктор HttpClient.On Windows, you can also choose to use System.Net.Http.WinHttpHandler, which relies on a native implementation, or the SocketsHttpHandler class by passing an instance of the class to the HttpClient constructor.

В macOS и Linux вы можете настроить HttpClient только отдельно для каждого процесса.On Linux and macOS, you can only configure HttpClient on a per-process basis. В Linux необходимо развернуть libcurl, если вы хотите использовать старую реализацию HttpClient.On Linux, you need to deploy libcurl if you want to use the old HttpClient implementation. (Она устанавливается вместе с .NET Core 2.0.)(It is installed with .NET Core 2.0.)

См. такжеSee also