LoginSignup
9
10

More than 1 year has passed since last update.

dotnet-6.0におけるシングルファイルアプリの変更点(5.0からの差分)

Last updated at Posted at 2021-11-14

はじめに

以前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がメインブランチに入る予定なので、また書くことが増えるかもしれない。

参考リンク

9
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10