はじめに
本スライドは「C# Tokyo」ユーザーグループの下記のイベントの発表資料です。
.NET Core 3.0 リリース記念 C# Tokyo 2019/10
.NET Core 3.0の魅力
- 単一実行可能ファイル
- Side by Sideの復活
- 快適な動作速度
- WPF・WinFormsのサポート
- 先進的な機能の数々
本日のお題
- 単一実行可能ファイル
- Runtimeの同梱・非同梱
- AOTコンパイル
何がうれしいのか?
- 配布品質の向上(配布ミス削減)
- 配布先環境のRuntime非依存
- Runtimeの混在が可能
- Runtimeの逐次バージョンアップが容易に
- AOTによる起動速度の向上
注意点
- これがすべてじゃないのが注意点
- でかい
- 初回起動速度の低下(unzip処理が発生)
- でかい
- 実行パスが配置した場所と異なる
- でかい
とはいえ...
- サーバーサイドではメリットが勝ちそう?※
- ランタイム非同梱ならクライアントでも?
導入背景によるので一概にはなんとも
※IISやWindows Serviceへの登録はまだ未確認
具体的なパラメーター
No. | 項目 | 説明 |
---|---|---|
1 | /p:PublishSingleFile | 単一ファイルの実行可能バイナリの作成 |
2 | /p:PublishReadyToRun | AOTコンパイル |
3 | /p:PublishTrimmed | 不要コードの削除 |
4 | Warp | 同上(サードパーティ製) |
5 | --self-contained | ランタイム同梱するか否か |
Demo
Demo Script
mkdir Demo
cd Demo
dotnet new sln
mkdir ConsoleApp
cd ConsoleApp
dotnet new console
dotnet sln ..\Demo.sln add ConsoleApp.csproj
dotnet run
dotnet publish -c Release -r win10-x64
dotnet publish -c Release -r win10-x64 /p:PublishSingleFile=true
dotnet publish -c Release -r win10-x64 /p:PublishSingleFile=true /p:PublishReadyToRun=true
dotnet publish -c Release -r win10-x64 /p:PublishSingleFile=true /p:PublishReadyToRun=true /p:PublishTrimmed=true
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls" ; Invoke-WebRequest https://github.com/dgiagio/warp/releases/download/v0.3.0/windows-x64.warp-packer.exe -OutFile warp-packer.exe
.\warp-packer --arch windows-x64 --input_dir bin\Release\netcoreapp3.0\win10-x64\publish --exec ConsoleApp.exe --output ConsoleApp.exe
dotnet publish -c Release -r win10-x64 /p:PublishSingleFile=true /p:PublishReadyToRun=true --self-contained=false
空コンソールアプリのファイルサイズ
No. | 項目 | Case1 | Case2 | Case2 | Case3 | Case4 | Case5 |
---|---|---|---|---|---|---|---|
1 | /p:PublishSingleFile | - | TRUE | TRUE | TRUE | TRUE | TRUE |
2 | /p:PublishReadyToRun | - | - | TRUE | TRUE | TRUE | TRUE |
3 | /p:PublishTrimmed | - | - | - | TRUE | TRUE | - |
4 | Warp | - | - | - | - | TRUE | - |
5 | --self-contained | - | TRUE | TRUE | TRUE | TRUE | FALSE |
サイズ | 161[KB] | 65.8 [MB] | 65.8 [MB] | 25.4 [MB] | 12.0[MB] | 162 [KB] |
空WPFアプリのファイルサイズ
No. | 項目 | Case1 | Case2 | Case2 | Case3 | Case4 | Case5 |
---|---|---|---|---|---|---|---|
1 | /p:PublishSingleFile | - | TRUE | TRUE | TRUE | TRUE | TRUE |
2 | /p:PublishReadyToRun | TRUE | TRUE | TRUE | TRUE | ||
3 | /p:PublishTrimmed | TRUE | TRUE | - | |||
4 | Warp | TRUE | - | ||||
5 | --self-contained | TRUE | TRUE | TRUE | TRUE | FALSE | |
サイズ | 164[KB] | 149 [MB] | 149 [MB] | 134 [MB] | 55.5[MB] | 164 [KB] |
.csprojにも書けます
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<PublishTrimmed>true</PublishTrimmed>
<PublishReadyToRun>true</PublishReadyToRun>
</PropertyGroup>
</Project>
参考情報
公式ドキュメント
https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md#user-experience
なぜか詳しいおっちゃんのサイト
https://www.hanselman.com/blog/MakingATinyNETCore30EntirelySelfcontainedSingleExecutable.aspx