20
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#でWindowsフォームアプリのexeにdllを組み込む

Last updated at Posted at 2024-05-31

はじめに

Windowsアプリケーションを作成していると、いつの間にかdllファイルだけで2~3スクロールするようになってしまった。

なんとなく1つにまとめたい。

参考にしたサイト

その昔(遥か昔)できなかった事ができるようになっていた。

環境

  • .NET 8
  • Visual Studio 2022
  • C#

プロジェクトの作成

Visual StudioでWindows フォーム アプリを選択し.NET8を選択する。

image.png

dllがまとまるのを見たかったのでNuGetよりNLogをインストール。
デバッグでビルドすると以下の出力内容となる。

image.png

単一アプリにする方法

ソリューションを右クリックし発行を選択し、実行プロファイルを作成。

image.png

実行プロファイルを作成する

手順は以下の通り

  1. ターゲットでフォルダーを選択
  2. 特定のターゲットでフォルダーを選択
  3. 場所はデフォルト

実行プロファイルの作成が完了すると公開準備が完了しましたとなり発行可能となります。

ここですべての設定を表示を選択しプロファイル設定を変更します。

image.png

変更箇所

  1. 配置モードを自己完結
  2. ファイルの公開オプションで単一ファイルの作成にチェック

image.png

設定完了後、発行ボタンを実行すると指定フォルダの中にexeが作成されます。

image.png

実際に出力された中身。

image.png

単一ファイルの作成とありましたが、この設定だけでは完全にまとめきれないようなのでIncludeNativeLibrariesForSelfExtractプロパティを指定します。

設定方法

ソリューションのWinformsApp1をダブルクリックし、WinFormsApp1.csprojを開きます。

image.png

PropertyGroupにIncludeNativeLibrariesForSelfExtractプロパティを追加しTrueを指定します。

WinFormsApp1.csproj

<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近くあります。

image.png

圧縮してみる

単一ファイルアプリケーションを圧縮する方法はEnableCompressionInSingleFileプロパティをtrueに設定することで圧縮する事が可能です。

WinFormsApp1.csproj

<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にまで圧縮されています。

image.png

メモリ消費について

起動時、無圧縮(141MBの方)はメモリを20MB程度利用するのに対し、圧縮版(64MB)では70MB消費していました。
圧縮しているので展開にメモリを要するのかと思いますが、メモリを消費するアプリケーションを作成する場合は圧縮しない方が良いかもしれません。

20
21
0

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
20
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?