.NET Core 2.1 の新機能What'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

.NET Core 2.1 に付属のツールである .NET Core 2.1 SDK (v 2.1.300) には次の変更点と拡張機能が含まれています。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. これにより、dotnet build が実行されるたびに大きなコード ブロックを JIT コンパイルする必要がなくなります。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
    

新しい CLI コマンドNew CLI commands

DotnetCliToolReference を使用してプロジェクト単位でのみ入手可能であった複数のツールを .NET Core SDK の一部として入手できるようになりました。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 に渡される引数から dotnet watch コマンドに直接渡されるオプションを区切るものです。It delimits the options passed directly to the dotnet watch command from the arguments that are passed to the child dotnet process. このオプションを使用しないと、--verbose オプションが dotnet build コマンドではなく dotnet watch コマンドに適用されます。Without it, the --verbose option applies to the dotnet watch command, not the dotnet build command.

    詳細については、「dotnet watch を使用した ASP.NET Core アプリの開発」を参照してください。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 Command-line Tools」(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 Global Tools overview」(.NET Core グローバル ツールの概要) を参照してください。For more information, see .NET Core Global Tools overview.

dotnet tool コマンドによるツールの管理Tool management with the dotnet tool command

.NET Core 2.1 SDK では、すべてのツール操作で 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 2.0 以降のすべての .NET Core アプリケーションは、システムにインストールされている最新のマイナー バージョンに自動的にロールフォワードされます。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 Core 2.0 を使用してビルドされ、ホスト システムにインストールされているのが .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.2.0 または .NET Core 3.0.0 ではなく、.NET Core 2.0.1 にロール フォワードされます。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.

この設定は、次の 3 つのいずれかの方法で変更できます。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 CLI ツールを使用している場合、次のオプションに目的の値を指定して .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. .NET Core 2.1 SDK (v 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.

.NET Core 2.0 SDK を使用すると、RuntimeFrameworkVersion プロパティで別のバージョンが指定されている場合を除き、自己完結型アプリケーションが .NET Core 2.0.0 ランタイムでパブリッシュされます。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. 今後は常に .NET Core 2.1 SDK (v 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.

Windows 互換機能パックWindows 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. この Windows 互換機能パックでは、.NET Core よりも 20,000 個も多い API にアクセスできます。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 コンパイラで実行される重要なタスクの 1 つはコード実行の最適化です。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 コンパイルに次の 2 つのステージが導入されます。Tiered compilation introduces two stages in JIT compilation:

  • 第 1 階層: コードをできるだけ早く生成します。A first tier, which generates code as quickly as possible.

  • 第 2 階層: 頻繁に実行されるメソッドに対して、最適化されたコードを生成します。A second tier, which generates optimized code for those methods that are executed frequently. コンパイルの第 2 階層は、パフォーマンスの向上と並行して実行されます。The second tier of compilation is performed in parallel for enhanced performance.

次に示す 2 つのいずれかの方法で階層型コンパイルをオプトインできます。You can opt into tiered compilation in either of two ways.

  • .NET Core 2.1 SDK を使用するすべてのプロジェクトで階層型コンパイルを使用するには、次の環境変数を設定します。To use tiered compilation in all projects that use the .NET Core 2.1 SDK, set the following environment variable:

    COMPlus_TieredCompilation="1"
    
  • プロジェクト単位で階層型コンパイルを使用するには、次の例に示すように、MSBuild プロジェクト ファイルの <PropertyGroup> セクションに <TieredCompilation> プロパティを追加します。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>
    

API の変更API 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

Brotli 圧縮Brotli compression

.NET Core 2.1 には、Brotli 圧縮と展開のサポートが追加されています。.NET Core 2.1 adds support for Brotli compression and decompression. Brotli は、RFC 7932 で定義されており、ほとんどの Web ブラウザーと主要な Web サーバーでサポートされている汎用の無損失圧縮アルゴリズムです。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;
}
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

BrotliStream の動作は、DeflateStream および GZipStream と同じです。そのため、これらの API を呼び出すコードを簡単に BrotliStream に変換できます。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:

ソケットの機能強化Sockets improvements

.NET Core には、新しい型である System.Net.Http.SocketsHttpHandler、および高度なネットワーク API の基盤となる書き換えられた System.Net.Http.HttpMessageHandler が含まれています。.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.SocketsHttpHandlerHttpClient 実装の基盤です。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. ただし、AppContext.SetSwitch メソッドを呼び出すことで、古い HttpClientHandler クラスを使用するようにアプリケーションを構成できます。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_USESOCKETSHTTPHANDLERfalse または 0 に設定します。To do this, set the DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER to either false or 0.

Windows では、ネイティブ実装に依存する System.Net.Http.WinHttpHandler を使用するか、または HttpClient コンストラクターにクラスのインスタンスを渡すことにより SocketsHttpHandler クラスを使用することもできます。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.

Linux と macOS では、HttpClient をプロセス単位でのみ構成できます。On Linux and macOS, you can only configure HttpClient on a per-process basis. Linux で古い HttpClient 実装を使用する場合は、libcurl を配置する必要があります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