Пакет 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
dotnetwatch -- --verbosebuild
Обратите внимание на параметр -- перед параметром --verbose. Он отделяет параметры, передаваемые непосредственно в команду dotnet watch, от аргументов для дочернего процесса dotnet. Без него параметр --verbose был бы применен к команде dotnet watch, а не к dotnet build.
.NET Core 2.1 поддерживает глобальные инструменты, то есть специальные средства, которые доступны глобально из командной строки. Модель расширяемости в предыдущих версиях .NET Core предоставляла пользовательские средства только отдельно для каждого проекта с использованием DotnetCliToolReference.
Чтобы установить глобальные инструменты, выполните команду dotnet tool install. Например:
Интерфейс командной строки.NET
dotnettool install -g dotnetsay
Установленные инструменты можно запускать из командной строки, указав имя инструмента. См. дополнительные сведения о глобальных инструментах .NET Core.
Управление инструментами с помощью команды dotnet tool
В пакете SDK для .NET Core 2.1 все действия с инструментами выполняются с помощью команды dotnet tool. Имеются следующие варианты:
Все приложения .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
dotnetrun --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).
При переносе существующего кода с платформы .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;
classProgram
{
staticvoidMain()
{
int[] numbers = newint[100];
for (int i = 0; i < 100; i++)
{
numbers[i] = i * 2;
}
var part = new Span<int>(numbers, start: 10, length: 10);
foreach (varvaluein 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
Сжатие Brotli
В .NET Core 2.1 добавлена поддержка сжатия и распаковки Brotli. Brotli — это универсальный алгоритм сжатия данных без потерь, который определен в RFC 7932 и поддерживается большинством веб-браузеров и всеми основными веб-серверами. Вы можете использовать потоковый класс System.IO.Compression.BrotliStream или высокопроизводительные классы System.IO.Compression.BrotliEncoder и System.IO.Compression.BrotliDecoder на основе диапазонов. Следующий пример демонстрирует сжатие с применением класса BrotliStream.
C#
publicstatic Stream DecompressWithBrotli(Stream toDecompress)
{
MemoryStream decompressedStream = new MemoryStream();
using (BrotliStream decompressionStream = new BrotliStream(toDecompress, CompressionMode.Decompress))
{
decompressionStream.CopyTo(decompressedStream);
}
decompressedStream.Position = 0;
return decompressedStream;
}
Public Function DecompressWithBrotli(toDecompress As Stream) As Stream
Dim decompressedStream As New MemoryStream()
Using decompressionStream As New BrotliStream(toDecompress, CompressionMode.Decompress)
decompressionStream.CopyTo(decompressedStream)
End Using
decompressedStream.Position = 0
Return decompressedStream
End Function
Доступен новый API криптографии на основе Span<T>, который поддерживает хэширование, HMAC, криптографический генератор случайных чисел, генератор асимметричной подписи, обработку асимметричной подписи и шифрование RSA.
FixedTimeEquals выполняется в течение строго фиксированного промежутка времени для любых входных параметров одинаковой длины, что очень удобно для использования в криптографической проверке без добавления информации о времени работы стороннего канала.
Процедура ZeroMemory выполняет очистку памяти и не может быть оптимизирована.
Эллиптические кривые Диффи—Хелмана (ECDH) теперь доступны в семействе классов System.Security.Cryptography.ECDiffieHellman. Контактная зона сохраняется такой же, как в .NET Framework.
Экземпляр, возвращаемый RSA.Create, умеет шифровать и расшифровывать данные с помощью OAEP и хэш-кода SHA-2, а также создавать и проверять подписи с помощью RSA-PSS.
Можно также использовать переменную среды, чтобы отказаться от использования реализации сокетов на основе SocketsHttpHandler. Для этого задайте для свойства DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER значение false или 0.
В macOS и Linux вы можете настроить HttpClient только отдельно для каждого процесса. В Linux необходимо развернуть libcurl, если вы хотите использовать старую реализацию HttpClient. (Она устанавливается вместе с .NET Core 2.0.)
Критические изменения
Дополнительные сведения о критических изменениях для перехода с версии 2.0 на 2.1 см. в этой статье.
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET
.NET — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
Создавайте независимо развертываемые, высокомасштабируемые и устойчивые приложения и службы с помощью бесплатной и открытой платформы .NET. С помощью .NET можно использовать популярные технологии микрослужб, такие как Docker, Kubernetes, Dapr, Реестр контейнеров Azure и многое другое для приложений и служб .NET и ASP.NET Core.