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


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

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

Основные библиотеки .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 sneak peek.

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

.NET Core 2.1

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

Затронутые API

См. также


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

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

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

В .NET Core 2.0 и предыдущих версиях некоторые предоставленные типы структур, например ConsoleKeyInfo, могли быть созданы без использования new оператора или литерала по умолчанию в C#. Это было связано с тем, что эталонные сборки , используемые компилятором 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 — использование неназначенных локальных переменных key

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

2.1

Создавайте экземпляры new типов структуры с помощью 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!");

Категория

Основные библиотеки .NET

Затронутые API


Версии OpenSSL в macOS

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

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

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

Ранее среда выполнения .NET Core использовала версии OpenSSL 1.0.x в macOS для типов, взаимодействующих с OpenSSL. Последняя версия 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 только в том случае, если версия 1.1.x недоступна.

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

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

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

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

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

Категория

Основные библиотеки .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-secret
Microsoft.Extensions.Caching.SqlConfig.Tools dotnet-sql-cache
Microsoft.EntityFrameworkCore.Tools.DotNet dotnet-ef

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

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

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

Категория

MSBuild

Затронутые API

Не применимо


См. также