はじめに
以前dotnet-5.0におけるシングルファイルアプリの記事を書いたが、dotnet-6.0リリースに当たり、また変更点が入ったので、差分について書く。
上記記事を読んだ前提で進めるので、わからなくなった場合は上の記事を読むことを推奨。
ネイティブDLLの統合
5.0の時は、シングルファイルをPublishすると、下記のようなネイティブDLLが出力されていた(Linuxの場合は拡張子が".so")
- coreclr.dll
- clrjit.dll
- clrcompression.dll
また、IncludeNativeLibrariesForSelfExtract=true
しても、実行時には結局テンポラリディレクトリに展開されるため、完全なるシングルファイルアプリとは言い辛かった。
しかし、6.0以降はこれらを統合したので、特にフラグを立てなくても完全に単一の実行可能ファイル(とWindowsの場合pdb)が出力されるようになった。
ただし、WPFとWinFormsの場合、以下のネイティブDLLは引き続き統合がされてないので注意が必要。
- D3DCompiler_*_cor3.dll
- PenImc_cor3.dll
- PresentationNative_cor3.dll
- vcruntime140_cor3.dll
- wpfgfx_cor3.dll
実行ファイルの圧縮
素の状態でのPublishは、5.0とそう変わらないサイズだが、新しいオプションとして、EnableCompressionInSingleFile=true
を指定することによって、
アセンブリを圧縮した状態でシングルファイルとして出力できるようになった。
圧縮率に関しては調整はできないが、Hello Worldレベルでは大体半分くらいのサイズになる(70MB→30~40MB位)。
ただし、実行時の展開処理が入るため、代償として立ち上がりがある程度遅くなる。
TrimModeのデフォルト値の変更
PublishTrimmedしたときのTrimModeのデフォルト値が、"copyused"から"link"に変わっている。
これにより、net5.0からnet6.0にアップデートした後、PublishTrimmedしたアプリの挙動が変わる可能性があるので、
安全策を取りたいならば明示的に"TrimMode"の値を指定した方が良いかもしれない。
WPFとWinFormsアプリのPublishTrimmedの無効化
dotnet-sdk-5.0以前では、WPFやWinFormsアプリでもPublishTrimmed=trueでトリミングが動いたが、
実際に走らせる段になるとエラーが出て終了する場合が多かった。(TrimmerRootAssemblyである程度回避もできるという報告もあったようだが)
dotnet-sdk-6.0ではPublish時に明確にNETSDK1168(WPF),NETSDK1175(WinForms)エラーが出るようになった。
これはSDKがやっていることなので、TargetFramework=net5.0でも該当するので注意。
https://docs.microsoft.com/en-us/dotnet/core/deploying/trimming/incompatibilities
終わりに
短めだが、差分なのでこんなものである。TrimModeの変更は大きいところなので注意が必要かもしれない。
net7.0では、NativeAOTがメインブランチに入る予定なので、また書くことが増えるかもしれない。