developers blog

exe と dll を一つにまとめる ILMerge の使い方 (C#)

はじめに

C# で、Windows Forms アプリケーションやコンソールアプリケーションを作成する時、 NuGet 等から便利なパッケージを追加していくと、参照するアセンブリ (dll) が増えてしまい、使い勝手が悪くなってしまいます。
そこで、 ILMerge を使用し、アセンブリを一つの exe ファイルにまとめることにより、 exe ファイル一つだけ管理すればいいので使い勝手が良くなります。

ILMerge のダウンロード

まずは ILMerge.exe をダウンロードします。いくつか方法がありますが、NuGet でパッケージをダウンロードする方法と、インストーラ形式でインストールする場合があります。

NuGet でのインストール

NuGet で、ILMerge を検索してインストールします。ソリューションフォルダの packages\ILMerge.(version)\tools\ にファイルがダウンロードされます。

インストーラ形式でのインストール

以下のページから、ILMerge.msi という名前のインストーラをダウンロードします。

ilmerge

ダウンロードしたファイルを実行し、画面の説明に従ってインストールします。64bit の Windows7 の場合、C:\Program Files (x86)\Microsoft\ILMerge\ にインストールされます。
※使用する際、環境変数 PATH に exe ファイルのパスを含めておくと、いちいちパスを記述する必要がなく使い勝手がよいです。

ILMergeの使い方

ILMerge はコンソールアプリケーションのため、コマンドプロンプトから使用します。基本的な構文としては以下の通りです。

1>ilmerge /out:(マージ後.exe) (マージ前.exe) (マージ対象.dll)

例えば、 TestA.exe と TestB.dll をまとめて TestC.exe にするには、以下のようにします。

1>ilmerge /out:TestC.exe TestA.exe TestB.dll

または、複数の dll を一度にまとめる場合は、ワイルドカードオプションを使用します。

1>ilmerge /wildcards /out:TestC.exe TestA.exe *.dll

コマンドプロンプトを開き、引数をつけずに実行するとオプション一覧が表示されます。

1>ilmerge 
2Usage: ilmerge [/lib:directory]* [/log[:filename]] [/keyfile:filename [/delaysign]] [/internalize[:filename]] [/t[arget]:(library|exe|winexe)] [/closed] [/ndebug] [/ver:version] [/copyattrs [/allowMultiple]] [/xmldocs] [/attr:filename] ([/targetplatform:<version>[,<platformdir>]]|v1|v1.1|v2|v4) [/useFullPublicKeyForReferences] [/zeroPeKind] [/wildcards] [/allowDup[:typename]]* [/allowDuplicateResources] [/union] [/align:n] /out:filename <primary assembly> [<other assemblies>...]

よく使用するオプションは以下の通りです。

  • /log[:filename] : 指定した場合ログを出力します。ファイル名の指定がない場合は、コンソールにログが出力されます。default:false
  • /ndebug : 出力ファイル用の pdb ファイルの作成、および、入力ファイルの pdb ファイルのマージを設定します。 pdb ファイルを作成しない場合は、false を設定します。default:true
  • /wildcards : ワイルドカードを使用して、入力ファイルをマッチングします。default:false

その他のオプションに関しては、以下を参照してください。

ILMerge