はじめに
以前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)が出力されるようになった。
実行ファイルの圧縮
素の状態でのPublishは、5.0とそう変わらないサイズだが、新しいオプションとして、EnableCompressionInSingleFile=trueを指定することによって、
アセンブリを圧縮した状態でシングルファイルとして出力できるようになった。
圧縮率に関しては調整はできないが、Hello Worldレベルでは大体半分くらいのサイズになる(70MB→30~40MB位)。
ただし、実行時の展開処理が入るため、代償として立ち上がりがある程度遅くなる。
TrimModeのデフォルト値の変更
PublishTrimmedしたときのTrimModeのデフォルト値が、"copyused"から"link"に変わっている。
これにより、net5.0からnet6.0にアップデートした後、PublishTrimmedしたアプリの挙動が変わる可能性があるので、
安全策を取りたいならば明示的に"TrimMode"の値を指定した方が良いかもしれない。
終わりに
短めだが、差分なのでこんなものである。TrimModeの変更は大きいところなので注意が必要かもしれない。
net7.0では、NativeAOTがメインブランチに入る予定なので、また書くことが増えるかもしれない。
参考リンク
単一実行ファイルについての公式ドキュメント
↧