はじめに
Windowsアプリケーションを作成していると、いつの間にかdllファイルだけで2~3スクロールするようになってしまった。
なんとなく1つにまとめたい。
参考にしたサイト
その昔(遥か昔)できなかった事ができるようになっていた。
環境
- .NET 8
- Visual Studio 2022
- C#
プロジェクトの作成
Visual StudioでWindows フォーム アプリを選択し.NET8を選択する。
dllがまとまるのを見たかったのでNuGetよりNLogをインストール。
デバッグでビルドすると以下の出力内容となる。
単一アプリにする方法
ソリューションを右クリックし発行を選択し、実行プロファイルを作成。
実行プロファイルを作成する
手順は以下の通り
- ターゲットでフォルダーを選択
- 特定のターゲットでフォルダーを選択
- 場所はデフォルト
実行プロファイルの作成が完了すると公開準備が完了しましたとなり発行可能となります。
ここですべての設定を表示を選択しプロファイル設定を変更します。
変更箇所
- 配置モードを自己完結
- ファイルの公開オプションで単一ファイルの作成にチェック
設定完了後、発行ボタンを実行すると指定フォルダの中にexeが作成されます。
実際に出力された中身。
単一ファイルの作成とありましたが、この設定だけでは完全にまとめきれないようなのでIncludeNativeLibrariesForSelfExtractプロパティを指定します。
設定方法
ソリューションのWinformsApp1をダブルクリックし、WinFormsApp1.csprojを開きます。
PropertyGroupにIncludeNativeLibrariesForSelfExtractプロパティを追加しTrueを指定します。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="5.3.2" />
</ItemGroup>
</Project>
これで組み込むことができましたが、発行されたexeは初期状態で140MB近くあります。
圧縮してみる
単一ファイルアプリケーションを圧縮する方法はEnableCompressionInSingleFileプロパティをtrueに設定することで圧縮する事が可能です。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="NLog" Version="5.3.2" />
</ItemGroup>
</Project>
公式ドキュメントに圧縮にはパフォーマンス コストが伴います。 アプリケーションの起動時に、アセンブリをメモリに展開する必要があり、この処理に時間がかかります。 とありますが、ハローワールドレベルのプログラムだと体感では分かりにくいレベルでした。
また、圧縮に関しては140MBだったものが64MBにまで圧縮されています。
メモリ消費について
起動時、無圧縮(141MBの方)はメモリを20MB程度利用するのに対し、圧縮版(64MB)では70MB消費していました。
圧縮しているので展開にメモリを要するのかと思いますが、メモリを消費するアプリケーションを作成する場合は圧縮しない方が良いかもしれません。