rksoftware

Visual Studio とか C# とかが好きです

dotnet core のインストールされていないない環境でも動作する dotnet core アプリケーションを作る

■ 結論

・Windows 向けにはコンソールで次のようにタイプして発行します。

>dotnet publish -c Release --self-contained true -r win-x64

・Linux 向けには

>dotnet publish -c Release --self-contained true -r linux-x64

・mac 向けには

>dotnet publish -c Release --self-contained true -r osx-x64

■ 前書き

.NET Core アプリケーションは発行する際に

  • フレームワークに依存する展開
  • 自己完結型の展開

を選択して発行できます。

※.NET Core 2.2 以降では フレームワークに依存する実行可能ファイル もありますが、ここでは省略します。
参考:.NET Core アプリケーションの展開

※この記事では NetCoreConsoleApp1 という名前でアプリを作っています。コマンドは実際に作成するアプリ名に置き換えて使ってください。

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

こんな感じに最低限のファイルが生成されます。

実行には .NET Core がインストールされた環境が必要で、コンソールで

>dotnet NetCoreConsoleApp1.dll

のようにして実行できます。

□ 自己完結型の展開

こんな感じに大量のファイルが出力フォルダに生成/コピーされます。

Windows 向けに発行した場合、画像の様に .exe ファイルも生成され、コンソールで

>NetCoreConsoleApp1.exe

のようにして実行できます。

■ 自己完結型の展開は何がうれしいの?

色々な意見があると思いますが、例えば現実として .NET Framework が古いバージョンしかインストールされておらず、限定した機能しか使えないなんてことがあります。
自己完結型であれば、実行環境のランタイムのバージョンに悩まされることがなくなります。

また、作ったアプリケーションを配布する際にも、.NET Framework や .NET Core が良くわからないという方向けに配布する場合も多いでしょう。特に商用アプリケーションなど、ユーザーにそこまでの PC スキルを求めるのも厳しいでしょう。

そんなとき、配布バイナリをただ PC 上に置けば OK のこの形式が悩みを解決してくれると期待しています。

□ 自己完結型の展開の欠点

配布サイズが非常に大きくなります。(Hello World アプリケーションで64~70 MB)
実行環境のランタイムのセキュリティアップデートという概念がないので、セキュリティアップデートなどでもアプリケーションの配布しなおしになる可能性があります。

■ Visual Studio 上から発行

Visual Studio からは GUI でポチポチして発行できます。

  • ソリューションエクスプローラーで 右クリックして > 発行

  • 発行の設定で 構成 をクリック

  • プロファイルの設定開きます

  • 配置モードで 自己完結 を選択
    これで自己完結型の展開になります。

  • ターゲット ランタイムを選択
    フレームワーク依存 の場合はポータブルが選択可能ですが

    自己完結 にするとポータブルは選択できなくなります。

ちなみに、フレームワーク依存 でポータブル以外を選択してもあまり意味はなさそうです。
※もしかしたら作成されるバイナリが少し小さくなっているかもしれません。

  • 発行 で発行されます。

■ コマンドで自己完結型の発行

オプションの詳細は 公式ドキュメント を参照してください。
ここでは、今回の発行にかかわるオプションを見て行きます。

  • -c
    ビルドの構成を指定します。Release または Debug。デフォルトは Debug

  • --self-contained
    true自己完結型falseフレームワーク依存 になります。true (自己完結型) の場合、次の -r オプションが必須です。

  • -r
    実行環境を指定します。先の例だと win-x64 linux-x64 osx-x64 のいずれかを指定しています。
    より詳しい OS のバージョンやディストリビューションも指定できますが、全容は 公式ドキュメント を参照してください。

■ Windows 向けの発行

Windows 向けに発行すると次のように ファイル数: 217 サイズ: 66.0 MB (69,235,565 バイト) が出力されます。
見慣れた System.dll の他、coreclr.dll といった dll 群と実行形式 NetCoreConsoleApp1.exe が出力されます。

コンソールで次のようにタイプすると実行できます。

>NetCoreConsoleApp1.exe

■ Linux 向けの発行

Linux 向けに発行すると次のように ファイル数: 184 サイズ: 70.6 MB (74,043,517 バイト) が出力されます。
見慣れた System.dll の他、libcoreclr.so といった so 群と実行形式 NetCoreConsoleApp1 が出力されます。

コンソールで次のようにタイプすると実行できます。

>./NetCoreConsoleApp1

■ mac 向けの発行

mac 向けに発行すると次のように ファイル数: 183 サイズ: 64.5 MB (67,687,745 バイト) が出力されます。
見慣れた System.dll の他、libcoreclr.dylib といった dylib 群と実行形式 NetCoreConsoleApp1 が出力されます。

コンソールで次のようにタイプすると実行できます。

>chmod 744 NetCoreConsoleApp1
>./NetCoreConsoleApp1

■ 結論

・Windows 向けにはコンソールで次のようにタイプして発行、実行します。

>dotnet publish -c Release --self-contained true -r win-x64
>NetCoreConsoleApp1.exe

・Linux 向けには

>dotnet publish -c Release --self-contained true -r linux-x64
>./NetCoreConsoleApp1

・mac 向けには

>dotnet publish -c Release --self-contained true -r osx-x64
>chmod 744 NetCoreConsoleApp1
>./NetCoreConsoleApp1