.NET CLI を使用した .NET アプリの発行

この記事では、コマンド ラインから .NET アプリケーションを公開する方法を説明します。 .NET には、アプリケーションを公開する方法が 3 つ用意されています。 フレームワークに依存する展開を使用すると、ローカル環境にインストールされている .NET ランタイムを使用するクロスプラットフォームの .dll ファイルが生成されます。 フレームワークに依存する実行可能ファイルを使用すると、ローカル環境にインストールされている .NET ランタイムを使用するプラットフォーム固有の実行可能ファイルが生成されます。 自己完結型の実行可能ファイルを使用すると、プラットフォーム固有の実行可能ファイルが生成されて、.NET ランタイムのローカル コピーが組み込まれます。

これらの公開モードの概要については、.NET アプリケーションの展開に関するページを参照してください。

CLI の使用方法について簡単にわかるヘルプをお探しですか。 次の表では、アプリの公開方法についての例を示します。 ターゲット フレームワークは、-f <TFM> パラメーターを使用するか、プロジェクト ファイルを編集して、指定することができます。 詳細については、「公開の基礎」をご覧ください。

公開モード コマンド
フレームワークに依存する展開 dotnet publish -c Release -p:UseAppHost=false
フレームワークに依存する実行可能ファイル dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release
自己完結型の展開 dotnet publish -c Release -r <RID> --self-contained true

Note

  • -c Release パラメーターは必要ありません。 アプリのリリース ビルドを公開することを明示するために提供されています。
  • .NET SDK 3.1 以降を使用する場合、基本的な dotnet publish コマンドを実行するときの既定の公開モードは、フレームワークに依存する実行可能ファイルです。

公開の基礎

アプリを公開するときは、プロジェクト ファイルの設定 <TargetFramework> で既定のターゲット フレームワークを指定します。 任意の有効なターゲット フレームワーク モニカー (TFM) にターゲット フレームワークを変更できます。 たとえば、プロジェクトで <TargetFramework>net8.0</TargetFramework> を使用している場合は、.NET 8 をターゲットとするバイナリが作成されます。 この設定で指定されている TFM が、dotnet publish コマンドで使用される既定のターゲットになります。

複数のフレームワークをターゲットにしたい場合は、セミコロンで区切ることにより、<TargetFrameworks> の設定で複数の TFM 値を設定できます。 アプリをビルドするときは、ターゲット フレームワークごとにビルドが生成されます。 ただし、アプリを公開するときは、dotnet publish -f <TFM> コマンドでターゲット フレームワークを指定する必要があります。

-c パラメーターで変更しない限り、BUILD-CONFIGURATION の既定のモードは Debug です。

dotnet publish コマンドの既定の出力ディレクトリは ./bin/<BUILD-CONFIGURATION>/<TFM>/publish/ です。 たとえば、dotnet publish -c Release -f net8.0 と指定すると、./bin/Release/net8.0/publish/ に公開されます。 ただし、すべてのビルド出力に対して簡略化された出力パスとフォルダー構造をオプトインできます。 詳細については、「成果物の出力レイアウト」を参照してください。

ネイティブの依存関係

アプリにネイティブの依存関係がある場合、別のオペレーティング システムではアプリが実行されない可能性があります。 たとえば、ネイティブの Windows API を使用しているアプリは、macOS または Linux では実行されません。 プラットフォーム固有のコードを提供し、プラットフォームごとに実行可能ファイルをコンパイルする必要があります。

また、参照しているライブラリにネイティブの依存関係がある場合、すべてのプラットフォームではアプリを実行できない可能性があることも考慮してください。 ただし、参照している NuGet パッケージには、必要なネイティブの依存関係を処理するためにプラットフォーム固有のバージョンが含まれている可能性があります。

ネイティブの依存関係があるアプリを配布するときは、dotnet publish -r <RID> スイッチを使用して、公開対象のターゲット プラットフォームを指定することが必要な場合があります。 ランタイム識別子の一覧については、ランタイム識別子 (RID) のカタログに関する記事をご覧ください。

プラットフォーム固有のバイナリの詳細については、「フレームワークに依存する実行可能ファイル」および「自己完結型の展開」セクションをご覧ください。

サンプル アプリ

次のアプリを使用して、公開コマンドを確認できます。 ターミナルで次のコマンドを実行すると、アプリが作成されます。

mkdir apptest1
cd apptest1
dotnet new console
dotnet add package Figgle

コンソール テンプレートによって生成される Program.cs または Program.vb ファイルを、次のように変更する必要があります。

using System;

namespace apptest1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"));
        }
    }
}
Module Program
    Sub Main(args As String())
        Console.WriteLine(Figgle.FiggleFonts.Standard.Render("Hello, World!"))
    End Sub
End Module

アプリを実行すると (dotnet run)、次の出力が表示されます。

  _   _      _ _         __        __         _     _ _
 | | | | ___| | | ___    \ \      / /__  _ __| | __| | |
 | |_| |/ _ \ | |/ _ \    \ \ /\ / / _ \| '__| |/ _` | |
 |  _  |  __/ | | (_) |    \ V  V / (_) | |  | | (_| |_|
 |_| |_|\___|_|_|\___( )    \_/\_/ \___/|_|  |_|\__,_(_)
                     |/

フレームワークに依存する展開

FDD としてアプリを公開すると、./bin/<BUILD-CONFIGURATION>/<TFM>/publish/ フォルダーに<PROJECT-NAME>.dll ファイルが作成されます。 アプリを実行するには、出力フォルダーに移動して、dotnet <PROJECT-NAME>.dll コマンドを使用します。

アプリは、特定のバージョンの .NET をターゲットにするように構成されます。 アプリが実行されるすべてのコンピューターには、そのターゲットの .NET ランタイムが存在する必要があります。 たとえば、アプリのターゲットが .NET Core 8 である場合、アプリを実行するマシンには、.NET Core 8 ランタイムがインストールされている必要があります。 「公開の基礎」セクションで説明したように、プロジェクト ファイルを編集することで、既定のターゲット フレームワークを変更したり、複数のフレームワークをターゲットにしたりできます。

FDD を公開すると、アプリが実行されるシステムで使用できる最新の .NET セキュリティ更新プログラムまで自動的にロールフォワードするアプリが作成されます。 コンパイル時のバージョンのバインドの詳細については、「使用する .NET のバージョンを選択する」を参照してください。

公開モード コマンド
フレームワークに依存する展開 dotnet publish -c Release -p:UseAppHost=false

フレームワークに依存する実行可能ファイル

フレームワークに依存する実行可能ファイル (FDE) が、基本的な dotnet publish コマンドの既定のモードです。 現在のオペレーティング システムをターゲットにする限り、他のパラメーターを指定する必要はありません。

このモードでは、クロスプラットフォーム アプリをホストするために、プラットフォームに固有の実行可能なホストが作成されます。 FDD では dotnet コマンドの形式でホストを要求するので、このモードは FDD と似ています。 ホストの実行可能ファイル名はプラットフォームごとに異なり、<PROJECT-FILE>.exe のような名前になります。 この実行可能ファイルは、dotnet <PROJECT-FILE>.dll を呼び出す (アプリの実行手段として引き続き使用可能) 代わりに、直接実行することができます。

アプリは、特定のバージョンの .NET をターゲットにするように構成されます。 アプリが実行されるすべてのコンピューターには、そのターゲットの .NET ランタイムが存在する必要があります。 たとえば、アプリのターゲットが .NET 8 である場合、アプリを実行するマシンには、.NET 8 ランタイムがインストールされている必要があります。 「公開の基礎」セクションで説明したように、プロジェクト ファイルを編集することで、既定のターゲット フレームワークを変更したり、複数のフレームワークをターゲットにしたりできます。

FDE を公開すると、アプリが実行されるシステムで使用できる最新の .NET セキュリティ更新プログラムまで自動的にロールフォワードするアプリが作成されます。 コンパイル時のバージョンのバインドの詳細については、「使用する .NET のバージョンを選択する」を参照してください。

公開モード コマンド
フレームワークに依存する実行可能ファイル dotnet publish -c Release -r <RID> --self-contained false
dotnet publish -c Release

-r スイッチを使用すると常に、出力フォルダーのパスが ./bin/<BUILD-CONFIGURATION>/<TFM>/<RID>/publish/ に変わります

アプリの例を使用する場合は、dotnet publish -f net6.0 -r win-x64 --self-contained false を実行します。 このコマンドでは、実行可能ファイル ./bin/Debug/net6.0/win-x64/publish/apptest1.exe が作成されます

Note

グローバリゼーション インバリアント モードを有効にすることで、展開の合計サイズを小さくすることができます。 このモードは、全世界を意識するものではなく、インバリアント カルチャの書式設定規則、大文字/小文字の区別規則、文字列比較、並べ替え順序を使用できるアプリケーションにとって便利です。 グローバリゼーション インバリアント モードの詳細と、それを有効にする方法については、.NET のグローバリゼーション インバリアント モードに関するページを参照してください。

.NET インストールの検索動作を構成する

.NET 9 以降のバージョンでは、AppHostDotNetSearch プロパティと AppHostRelativeDotNet プロパティを使用して、発行済み実行可能ファイルの .NET インストール検索パスを構成できます。

AppHostDotNetSearch では、実行可能ファイルが .NET インストールを検索する 1 つ以上の場所を指定できます。

  • AppLocal: アプリの実行可能ファイルのフォルダー
  • AppRelative: アプリの実行可能ファイルの相対パス
  • EnvironmentVariables: DOTNET_ROOT[_<arch>] 環境変数の値
  • Global: 登録済みおよび既定のグローバル インストール場所

AppHostRelativeDotNet では、AppHostDotNetSearchAppRelative が含まれているときに検索される実行可能ファイルの相対パスを指定します。

詳細については、AppHostDotNetSearchAppHostRelativeDotNet、および apphost のインストール場所のオプションを参照してください。

自己完結型の展開

自己完結型の展開 (SCD) を公開すると、.NET SDK によってプラットフォーム固有の実行可能ファイルが作成されます。 SCD の公開には、アプリの実行に必要なすべての .NET ファイルが含まれますが、.NET のネイティブの依存関係 (たとえば、Linux 上の .NET 6Linux 上の .NET 8) は含まれません。 これらの依存関係は、アプリを実行する前に、システムに存在している必要があります。

SCD の公開で作成されるアプリでは、使用可能な最新の .NET セキュリティ更新プログラムへのロールフォワードは行われません。 コンパイル時のバージョンのバインドの詳細については、「使用する .NET のバージョンを選択する」を参照してください。

dotnet publish コマンドで次のスイッチを使用して、SCD を公開する必要があります。

  • -r <RID>

    このスイッチでは、識別子 (RID) を使用してターゲット プラットフォームを指定します。 ランタイム識別子の一覧については、ランタイム識別子 (RID) のカタログに関する記事をご覧ください。

  • --self-contained true

    このスイッチは、SCD として実行可能ファイルを作成するよう .NET SDK に指示します。

公開モード コマンド
自己完結型の展開 dotnet publish -c Release -r <RID> --self-contained true

ヒント

  • .NET 6 以降では、トリミングして公開することでトリミング対応の自己完結型アプリの合計サイズを減らすことができます。 これによりトリマーが有効になり、コード パス上にないか、ランタイム リフレクションで参照される可能性がある参照アセンブリとフレームワークの一部が削除されます。 トリミングがアプリケーションに適しているか判断するには、「トリミングの非互換性」を参照してください。
  • グローバリゼーション インバリアント モードを有効にすることで、展開の合計サイズを小さくすることができます。 このモードは、全世界を意識するものではなく、インバリアント カルチャの書式設定規則、大文字/小文字の区別規則、文字列比較、並べ替え順序を使用できるアプリケーションにとって便利です。 グローバリゼーション インバリアント モードの詳細と、それを有効にする方法については、「.NET Core Globalization Invariant Mode」(.NET Core のグローバリゼーション インバリアント モード) を参照してください。

関連項目