Критические изменения в .NET Core 2.1

Если вы выполняете миграцию на версию 2.1 .NET Core, учитывайте критические изменения, перечисленные в этой статье, так как они могут влиять на работу приложения.

Библиотеки Core .NET

API-интерфейсы пути не выдают исключение для недопустимых символов

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

Описание изменений

На платформе .NET Framework и .NET Core 1.0–2.0 методы, перечисленные в разделе Затронутые API, выдают исключение ArgumentException, если аргумент пути содержит недопустимый символ. Начиная с версии .NET Core 2.1, эти методы больше не проверяют наличие недопустимых символов пути и не выдают исключение при обнаружении недопустимого символа.

Причина изменения

Агрессивная проверка символов пути блокирует некоторые межплатформенные сценарии. Это изменение было внесено, чтобы платформа .NET не пыталась реплицировать или предсказать результат вызовов API операционной системы. Дополнительные сведения см. в записи блога Предварительный обзор System.IO в .NET Core 2.1.

Представленная версия

.NET Core 2.1

Если ваш код использовал эти API для проверки наличия недопустимых символов, можно добавить вызов Path.GetInvalidPathChars.

Затронутые API

См. также раздел


Частные поля, добавленные во встроенные типы структур

Частные поля добавлены в некоторые типы структур в ссылочных сборках. В результате в C# эти типы структуры всегда должны создаваться с помощью оператора new или литерала по умолчанию.

Описание изменений

В .NET Core 2.0 и предыдущих версиях некоторые типы структур, например ConsoleKeyInfo, можно создать в C# без использования оператора new или литерала по умолчанию. Это вызвано тем, что ссылочные сборки, используемые компилятором C#, не содержат частных полей для структур. Все частные поля для типов структуры .NET добавляются в ссылочные сборки, начиная с .NET Core 2.1.

Например, следующий код C# компилируется в .NET Core 2.0, но не в .NET Core 2.1:

ConsoleKeyInfo key;    // Struct type

if (key.ToString() == "y")
{
    Console.WriteLine("Yes!");
}

В .NET Core 2.1 предыдущий код приводит к следующей ошибке компилятора: CS0165 — использование локальной переменной "name", которой не присвоено значение "key"

Представленная версия

2.1

Создайте экземпляры типов структуры с помощью оператора new или литерала по умолчанию.

Пример:

ConsoleKeyInfo key = new ConsoleKeyInfo();    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");
ConsoleKeyInfo key = default;    // Struct type.

if (key.ToString() == "y")
    Console.WriteLine("Yes!");

Категория

Библиотеки Core .NET

Затронутые API


Версии OpenSSL в macOS

В среде выполнения .NET Core 3.0 и более поздних версий в macOS вместо версий OpenSSL 1.0.x для типов AesCcm, AesGcm, DSAOpenSsl, ECDiffieHellmanOpenSsl, ECDsaOpenSsl, RSAOpenSsl и SafeEvpPKeyHandle теперь предпочтительно использовать версии OpenSSL 1.1.x.

Среда выполнения .NET Core 2.1 теперь поддерживает версии OpenSSL 1.1.x, однако предпочтительными по-прежнему являются версии OpenSSL 1.0.x.

Описание изменений

Ранее в среде выполнения .NET Core для типов, которые взаимодействуют с OpenSSL, использовались версии OpenSSL 1.0.x в macOS. Последняя версия OpenSSL 1.0.x (OpenSSL 1.0.2) теперь не поддерживается. Для сохранения типов, использующих OpenSSL в поддерживаемых версиях OpenSSL, в средах выполнения .NET Core 3.0 и более поздних версий теперь используются более новые версии OpenSSL в macOS.

В связи с этим изменением поведение сред выполнения .NET Core в macOS теперь реализуется следующим образом.

  • В средах выполнения .NET Core 3.0 и более поздних версий при условии доступности используется OpenSSL 1.1.x, и только если версия 1.1.x не доступна, осуществляется откат к OpenSSL 1.0.x.

    Для вызывающих объектов, использующих типы взаимодействия OpenSSL с пользовательскими методами P/Invoke, необходимо следовать указаниям в примечаниях SafeEvpPKeyHandle.OpenSslVersion. Если не проверить значение OpenSslVersion, приложение может аварийно завершить работу.

  • В средах выполнения .NET Core 2.1 при условии доступности используется OpenSSL 1.0.x, а если версия 1.0.x не доступна, осуществляется откат к OpenSSL 1.1.x.

    В среде выполнения версии 2.1 предпочтительно использовать более раннюю версию OpenSSL, поскольку в .NET Core 2.1 отсутствует свойство SafeEvpPKeyHandle.OpenSslVersion, в связи с чем во время выполнения невозможно гарантированно определить версию OpenSSL.

Представленная версия

  • .NET Core 2.1.16
  • .NET Core 3.0.3
  • .NET Core 3.1.2

Категория

Библиотеки Core .NET

Затронутые API


MSBuild

Средства проекта теперь включены в пакет SDK

Пакет SDK для .NET Core 2.1 теперь включает общие средства CLI, и больше не нужно включать в проект ссылки на эти средства.

Описание изменений

В .NET Core 2.0 проекты ссылаются на внешние инструменты .NET с помощью параметра проекта <DotNetCliToolReference>. В .NET Core 2.1 некоторые из этих средств включены в пакет SDK для .NET Core, и этот параметр больше не требуется. Если включить в проект ссылки на эти средства, появится сообщение об ошибке следующего вида: Средство "Microsoft.EntityFrameworkCore.Tools.DotNet" теперь включено в пакет SDK для .NET Core.

Средства, которые теперь входят в пакет SDK для .NET Core 2.1:

Значение <DotNetCliToolReference> Инструмент
Microsoft.DotNet.Watcher.Tools dotnet-watch
Microsoft.Extensions.SecretManager.Tools dotnet-user-secrets
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

Представленная версия

Пакет SDK для .NET Core 2.1.300

Удалите параметр <DotNetCliToolReference> из проекта.

Категория

MSBuild

Затронутые API

Н/Д