.NET Core 2.1 の破壊的変更

.NET Core のバージョン 2.1 に移行する場合、この記事の一覧にある破壊的変更がお使いのアプリに影響する可能性があります。

Core .NET ライブラリ

パス API から、無効な文字に対する例外はスローされません

ファイル パスを必要とする API では、パス文字の検証も、無効な文字が見つかった場合の ArgumentException のスローも行わなくなりました。

変更の説明

.NET Framework と .NET Core 1.0 - 2.0 では、パス引数に無効なパス文字が含まれている場合、影響を受ける API セクションにリストされているメソッドからは、ArgumentException がスローされます。 .NET Core 2.1 以降、これらのメソッドでは、無効なパス文字をチェックすることも、無効な文字が見つかった場合に例外をスローすることも行われなくなりました。

変更理由

パス文字を積極的に検証すると、一部のクロスプラットフォーム シナリオがブロックされます。 この変更は、オペレーティング システムの API 呼び出しの結果をレプリケートまたは予測する試みが .NET によって行われないようにするために導入されました。 詳細については、ブログ記事「.NET Core 2.1 の System.IO の先行プレビュー」を参照してください。

導入されたバージョン

.NET Core 2.1

ご利用のコードが無効な文字のチェックする上で、これらの API に依存していた場合は、Path.GetInvalidPathChars の呼び出しを追加できます。

影響を受ける API

関連項目


組み込みの構造体型に追加されたプライベート フィールド

プライベート フィールドが参照アセンブリ特定の構造体型に追加されました。 その結果、C# では、それらの構造体型は常に、new 演算子または default リテラルを使用してインスタンス化する必要があります。

変更の説明

.NET Core 2.0 およびそれ以前のバージョンでは、一部の提供されている構造体型 (たとえば、ConsoleKeyInfo) を、C# で new 演算子や default リテラルを使用せずにインスタンス化できました。 これは、C# コンパイラーによって使用される参照アセンブリに、構造体のプライベート フィールドが含まれていなかったためです。 .NET Core 2.1 以降、.NET 構造体型のすべてのプライベート フィールドが参照アセンブリに追加されます。

たとえば、次の 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 演算子または default リテラルを使用して構造体型をインスタンス化します。

次に例を示します。

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


macOS 上の OpenSSL バージョン

macOS 上の .NET Core 3.0 以降のランタイムでは AesCcmAesGcmDSAOpenSslECDiffieHellmanOpenSslECDsaOpenSslRSAOpenSslSafeEvpPKeyHandle の各型に対して OpenSSL 1.0.x バージョンよりも OpenSSL 1.1.x バージョンが優先されるようになりました。

.NET Core 2.1 ランタイムでは、OpenSSL 1.1.x バージョンがサポートされるようになりましたが、OpenSSL 1.0.x バージョンが引き続き優先されます。

変更の説明

以前、.NET Core ランタイムでは、macOS 上の OpenSSL 1.0.x バージョンは OpenSSL とやりとりする型に対して使用されていました。 最新の OpenSSL 1.0.x バージョンである OpenSSL 1.0.2 は現在サポートされていません。 サポートされているバージョンの OpenSSL 上で OpenSSL を使用する型を維持するために、.NET Core 3.0 以降のランタイムでは macOS 上でより新しいバージョンの OpenSSL が使用されるようになりました。

この変更により、macOS 上での .NET Core ランタイムの動作は次のようになります。

  • .NET Core 3.0 以降のバージョンのランタイムでは、使用可能な場合は OpenSSL 1.1.x が使用され、使用可能な 1.1.x バージョンがない場合にのみ OpenSSL 1.0.x にフォールバックします。

    カスタムの P/Invoke で OpenSSL 相互運用機能型を使用する呼び出し元については、SafeEvpPKeyHandle.OpenSslVersion の注釈にあるガイダンスに従ってください。 OpenSslVersion 値を確認しないと、ご利用のアプリがクラッシュする場合があります。

  • .NET Core 2.1 以降のバージョンのランタイムでは、使用可能な場合は OpenSSL 1.0.x が使用され、使用可能な 1.0.x バージョンがない場合にのみ OpenSSL 1.1.x にフォールバックします。

    .NET Core 2.1 には SafeEvpPKeyHandle.OpenSslVersion プロパティが存在しないため 2.1 ランタイムでは、以前のバージョンの OpenSSL が優先されます。結果として、実行時に OpenSSL のバージョンを確実に判断することができません。

導入されたバージョン

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

カテゴリ

Core .NET ライブラリ

影響を受ける API


MSBuild

プロジェクト ツールが SDK に追加されました

.NET Core 2.1 SDK に一般的な CLI ツールが追加されました。これらのツールをプロジェクトから参照する必要がなくなりました。

変更内容

.NET Core 2.0 では、<DotNetCliToolReference> プロジェクト設定で外部 .NET ツールがプロジェクトによって参照されます。 .NET Core 2.1 では、これらのツールの一部が .NET Core SDK に付属します。この設定は不要になりました。 プロジェクトにこれらのツールへの参照を含めると、"ツール 'Microsoft.EntityFrameworkCore.Tools.DotNet' は .NET Core SDK に付属するようになりました" のようなエラーが届きます。

.NET Core 2.1 SDK に追加されたツール:

<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

導入されたバージョン

.NET Core SDK 2.1.300

プロジェクトから <DotNetCliToolReference> 設定を削除します。

カテゴリ

MSBuild

影響を受ける API

N/A