.NET アプリケーションの発行の概要

.NET を使用して作成したアプリケーションは、2 つの異なるモードで発行できます。モードは、お客様のアプリをユーザーが実行する方法に影響します。

ご自分のアプリを "自己完結型" として発行すると、.NET ランタイムとライブラリ、さらにご自分のアプリケーションとその依存関係を含むアプリケーションが生成されます。 そのアプリケーションのユーザーは、.NET ランタイムがインストールされていないコンピューター上でそれを実行することができます。

ご自分のアプリを "フレームワーク依存" として発行すると、ご自分のアプリケーション自体とその依存関係のみを含むアプリケーションが生成されます。 そのアプリケーションのユーザーは、.NET ランタイムを個別にインストールする必要があります。

どちらの発行モードでも、既定ではプラットフォーム固有の実行可能ファイルが生成されます。 フレームワーク依存のアプリケーションは、実行可能ファイルなしで作成できます。これらのアプリケーションは、クロスプラットフォームです。

実行可能ファイルが生成されるときに、ランタイム識別子 (RID) を使用してターゲット プラットフォームを指定できます。 RID の詳細については、「.NET の RID カタログ」を参照してください。

次の表は、アプリをフレームワーク依存として、または自己完結型として発行するために使用するコマンドの概要を、SDK のバージョンごとに示しています。

種類 SDK 2.1 SDK 3.1 SDK 5.0 SDK 6.0 コマンド
現在のプラットフォーム用のフレームワーク依存の実行可能ファイル ✔️ ✔️ ✔️ dotnet publish
特定のプラットフォーム用のフレームワーク依存の実行可能ファイル ✔️ ✔️ ✔️ dotnet publish -r <RID> --self-contained false
フレームワーク依存のクロスプラットフォーム バイナリ ✔️ ✔️ ✔️ ✔️ dotnet publish
自己完結型の実行可能ファイル ✔️ ✔️ ✔️ ✔️ dotnet publish -r <RID>

詳細については、.NET dotnet publish コマンドに関するページを参照してください。

実行可能ファイルを生成する

実行可能ファイルはクロスプラットフォームではありません。 これは、オペレーティング システムおよび CPU アーキテクチャに固有のものです。 ご自分のアプリを発行して実行可能ファイルを作成するとき、アプリを自己完結型またはフレームワーク依存として発行することができます。 アプリを自己完結型として発行すると、そのアプリに .NET ランタイムが含められます。アプリのユーザーはアプリを実行する前に .NET のインストールについて心配する必要はありません。 フレームワーク依存として発行されたアプリには、.NET ランタイムとライブラリは含められません。アプリとサードパーティの依存関係のみが含められます。

次のコマンドを実行すると、実行可能ファイルが生成されます。

種類 SDK 2.1 SDK 3.1 SDK 5.0 SDK 6.0 コマンド
現在のプラットフォーム用のフレームワーク依存の実行可能ファイル ✔️ ✔️ ✔️ dotnet publish
特定のプラットフォーム用のフレームワーク依存の実行可能ファイル ✔️ ✔️ ✔️ dotnet publish -r <RID> --self-contained false
自己完結型の実行可能ファイル ✔️ ✔️ ✔️ ✔️ dotnet publish -r <RID>

クロスプラットフォーム バイナリを生成する

ご自分のアプリを dll ファイルの形式でフレームワーク依存として発行すると、クロスプラットフォーム バイナリが作成されます。 dll ファイルには、プロジェクトに基づいて名前が付けられます。 たとえば、word_reader という名前のアプリがある場合、word_reader.dll という名前のファイルが作成されます。 この方法で発行されたアプリは、dotnet <filename.dll> コマンドを使用して実行され、任意のプラットフォームで実行できます。

ターゲットとなる .NET ランタイムが既にインストールされていれば、クロスプラットフォーム バイナリを任意のオペレーティング システムで実行できます。 ターゲットとなる .NET ランタイムがインストールされていない場合、アプリがロール フォワードするように構成されていれば、より新しいランタイムを使用してアプリを実行することができます。 詳細については、「フレームワーク依存のアプリをロールフォワードする」を参照してください。

次のコマンドでは、クロスプラットフォーム バイナリが生成されます。

種類 SDK 2.1 SDK 3.x SDK 5.0 SDK 6.0 コマンド
フレームワーク依存のクロスプラットフォーム バイナリ ✔️ ✔️ ✔️ ✔️ dotnet publish

フレームワーク依存の発行

フレームワーク依存として発行されたアプリはクロスプラットフォームであり、.NET ランタイムは含まれていません。 アプリのユーザーは、.NET ランタイムをインストールする必要があります。

アプリをフレームワーク依存として発行すると、クロスプラットフォーム バイナリdll ファイルとして生成されるほか、現在ご利用のプラットフォームをターゲットとするプラットフォーム固有の実行可能ファイルが生成されます。 dll はクロスプラットフォームですが、実行可能ファイルはそうではありません。 たとえば、word_reader という名前のアプリを発行し、Windows をターゲットとすると、word_reader.exe 実行可能ファイルが word_reader.dll と共に作成されます。 Linux または macOS をターゲットとすると、word_reader 実行可能ファイルが word_reader.dll と共に作成されます。 RID の詳細については、「.NET の RID カタログ」を参照してください。

重要

.NET SDK 2.1 では、アプリをフレームワーク依存として発行しても、プラットフォーム固有の実行可能ファイルは生成されません。

アプリのクロスプラットフォーム バイナリは、dotnet <filename.dll> コマンドを使用して実行でき、任意のプラットフォームで実行できます。 プラットフォーム固有の実装を含む NuGet パッケージがアプリで使用される場合、すべてのプラットフォームの依存関係が、アプリと共に publish フォルダーにコピーされます。

特定のプラットフォーム用の実行可能ファイルを作成するには、-r <RID> --self-contained false パラメーターを dotnet publish コマンドに渡します。 -r パラメーターを省略すると、現在のプラットフォーム用の実行可能ファイルが作成されます。 ターゲットとするプラットフォーム用のプラットフォーム固有の依存関係が含まれている NuGet パッケージはいずれも、publish フォルダーにコピーされます。 プラットフォーム固有の実行可能ファイルが不要な場合は、プロジェクト ファイルで <UseAppHost>False</UseAppHost> を指定できます。 詳細については、「.NET SDK プロジェクトの MSBuild リファレンス」を参照してください。

長所

  • 小規模な展開
    ご自分のアプリとその依存関係のみが配布されます。 .NET ランタイムとライブラリはユーザーによってインストールされ、そのランタイムはすべてのアプリで共有されます。

  • クロスプラットフォーム
    ご自分のアプリと任意の NET ベースのライブラリは、他のオペレーティング システムでも実行されます。 ご自分のアプリに対してターゲット プラットフォームを定義する必要はありません。 .NET ファイル形式の詳細については、「.NET アセンブリ ファイルの形式」を参照してください。

  • パッチが適用された最新のランタイムを使用する
    アプリでは、ターゲット システムにインストールされている最新のランタイム (.NET のターゲットとなる major-minor ファミリ内の) が使用されます。 これは、パッチが適用された最新バージョンの .NET ランタイムが自動的に使用されることを意味します。 この既定の動作はオーバーライドできます。 詳細については、「フレームワーク依存のアプリをロールフォワードする」を参照してください。

短所

  • ランタイムを事前にインストールする必要がある
    ご自分のアプリを実行できるのは、このアプリでターゲットとされる .NET のバージョンがホスト システムに既にインストールされている場合のみです。 アプリで特定のバージョンの .NET が必要とされる場合、または新しいバージョンの .NET が許可される場合は、アプリのロール フォワード動作を構成することができます。 詳細については、「フレームワーク依存のアプリをロールフォワードする」を参照してください。

  • .NET が変更される可能性がある
    .NET ランタイムとライブラリは、アプリが実行されているコンピューター上で更新される可能性があります。 まれなケースとして、それにより、ほとんどのアプリで使用されている .NET ライブラリを使用すると、ご自分のアプリの動作が変わる場合があります。 より新しいバージョンの .NET をご自分のアプリで使用する方法を構成できます。 詳細については、「フレームワーク依存のアプリをロールフォワードする」を参照してください。

次の欠点は、.NET Core 2.1 SDK にのみ適用されます。

  • dotnet コマンドを使用してアプリを起動する
    お客様のアプリを起動するために、ユーザーは dotnet <filename.dll> コマンドを実行する必要があります。 .NET Core 2.1 SDK では、アプリがフレームワーク依存として発行される場合、プラットフォーム固有の実行可能ファイルは生成されません。

アプリをクロスプラットフォーム フレームワーク依存として発行します。 現在ご利用のプラットフォームをターゲットとする実行可能ファイルが dll ファイルと共に作成されます。

dotnet publish

アプリをクロスプラットフォーム フレームワーク依存として発行します。 Linux 64 ビットの実行可能ファイルが dll ファイルと共に作成されます。 このコマンドは .NET Core SDK 2.1 では機能しません。

dotnet publish -r linux-x64 --self-contained false

自己完結型の発行

自己完結型としてご自分のアプリを発行すると、プラットフォーム固有の実行可能ファイルが生成されます。 output publishing フォルダーには、.NET ライブラリやターゲット ランタイムなど、アプリのすべてのコンポーネントが格納されます。 このアプリは他の .NET アプリから分離されていて、ローカルにインストールされた共有ランタイムを使用しません。 お客様のアプリのユーザーは、.NET のダウンロードもインストールも行う必要がありません。

指定したターゲット プラットフォームに対して実行可能バイナリが生成されます。 たとえば、word_reader という名前のアプリを持っていて、Windows 用に自己完結型の実行可能ファイルを発行する場合、word_reader.exe ファイルが作成されます。 Linux または macOS 用に発行する場合は、word_reader ファイルが作成されます。 ターゲットのプラットフォームおよびアーキテクチャは、dotnet publish コマンドの -r <RID> パラメーターを使用して指定します。 RID の詳細については、「.NET の RID カタログ」を参照してください。

プラットフォーム固有の依存関係を含む NuGet パッケージなど、プラットフォーム固有の依存関係がアプリにある場合、それらはアプリと共に publish フォルダーにコピーされます。

長所

  • .NET バージョンの制御
    ご自分のアプリと共に展開する .NET のバージョンを制御できます。

  • プラットフォーム固有のターゲット設定
    プラットフォームごとにご自分のアプリを発行する必要があるため、アプリが実行される場所を把握できます。 .NET に新しいプラットフォームが導入された場合、そのプラットフォームをターゲットとするバージョンをお客様がリリースするまで、ユーザーはそのプラットフォームでお客様のアプリを実行できません。 ユーザーが新しいプラットフォームでアプリを実行する前に、アプリに互換性の問題がないかテストできます。

短所

  • 大規模な展開
    アプリには .NET ランタイムとアプリのすべての依存関係が含まれているため、必要とされるダウンロード サイズとハード ドライブの容量はフレームワーク依存のバージョンよりも大きくなります。

    ヒント

    .NET の "グローバリゼーション インバリアント モード" を使用することで、Linux システムでの展開のサイズを約 28 MB 小さくすることができます。 これにより、インバリアント カルチャのようなすべてのカルチャがアプリによって処理されるようになります。

    ヒント

    IL のトリミングにより、デプロイのサイズをさらに小さくすることができます。

  • .NET バージョンを更新するのが困難
    .NET ランタイム (ご自分のアプリと共に配布される) は、ご自分のアプリの新しいバージョンをリリースすることによってのみアップグレードできます。 ただし、必要に応じて、アプリが実行されているコンピューターのフレームワーク ライブラリの重要なセキュリティ更新プログラムは、.NET により更新されます。 このセキュリティ更新プログラムのシナリオでエンド ツー エンドの検証を行う必要があります。

使用例

アプリを自己完結型として発行します。 macOS 64 ビット実行可能ファイルが作成されます。

dotnet publish -r osx-x64

アプリを自己完結型として発行します。 Windows 64 ビット実行可能ファイルが作成されます。

dotnet publish -r win-x64

ReadyToRun イメージを使用した発行

ReadyToRun イメージを使用して発行すると、アプリケーションの起動時間が短縮されますが、アプリケーションのサイズは大きくなります。 ReadyToRun を使用して発行する方法の詳細については、ReadyToRun に関する記事をご覧ください。

長所

  • 起動時間の短縮
    アプリケーションで JIT の実行にかかる時間が短縮されます。

短所

  • サイズの増加
    ディスク上のアプリケーションのサイズが大きくなります。

使用例

アプリを自己完結型として、ReadyToRun を使用して発行します。 macOS 64 ビット実行可能ファイルが作成されます。

dotnet publish -c Release -r osx-x64 -p:PublishReadyToRun=true

アプリを自己完結型として、ReadyToRun を使用して発行します。 Windows 64 ビット実行可能ファイルが作成されます。

dotnet publish -c Release -r win-x64 -p:PublishReadyToRun=true

関連項目