Edited at

実行ファイルとDLLを一つにまとめる

More than 1 year has passed since last update.

Visual C# で、自作のクラスライブラリと実行ファイルを一つにまとめる(静的リンクもどきを行う)やり方です。

Microsoftが提供しているツール「ILMerge」で複数のアセンブリを一つのアセンブリにマージできます。

このツールを使うことで、自作のクラスライブラリのDLLと実行ファイルを一つにまとめることができます。


ILMergeの使い方

インストール後、コマンドプロンプトでこんな感じにコマンド打てばexeとDLLをマージしてくれます。


コマンドプロンプト ILMerge 実行例

"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /out:hoge_merge.exe hoge.exe piyo.dll foo.dll


/out: に出力ファイル名を指定します。(この例ではhoge_merge.exeを指定)

それ以外の引数にマージしたいexe、DLLファイル名を指定します。(この例ではhoge.exe、piyo.dll、foo.dllを指定)



ワイルドカードでファイル名を指定する

引数に渡すファイル名をワイルドカードで指定したい場合は次のように /wildcards を追加します。


コマンドプロンプト ワイルドカードによるファイル名指定の ILMerge 実行例

"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:hoge_merge.exe hoge.exe *.dll


ちなみに /wildcards を指定せずに実行するとエラーになります。


コマンドプロンプト /wildcards を指定しないときの ILMerge 実行例(エラーになる)

"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /out:hoge_merge.exe hoge.exe *.dll


実行結果


An exception occurred during merging:

ILMerge.Merge: Could not find the file '*.dll'.

   場所 ILMerging.ILMerge.Merge()

   場所 ILMerging.ILMerge.Main(String[] args)




Visual C# でビルドしたあと自動的にマージされるようにする

いちいちコマンドラインで入力するのがぶっちゃけ面倒なので、

ビルドかけたときに自動でexeとDLLをマージしてくれるようにします。

Windowsアプリケーションを出力するプロジェクトのプロパティで、

「ビルド イベント」の「ビルド後に実行するコマンドライン」に

次の内容を追加するとビルド後にマージを行うようになります。

(コピペですぐ使えるはず)


ビルド後に実行するコマンドライン

set fname_new=$(TargetName)_merge$(TargetExt)

"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:%fname_new% $(TargetFileName) *.dll

説明不要かと思いますが、一応。(Visual C# がごにょごにょしてくれる)


  • $(TargetName) … アプリケーションのアセンブリ名

  • $(TargetExt) … 拡張子(.exe)

  • $(TargetFileName) … 出力される実行ファイル名



注意

次のようにマージ後のファイル名を元のファイル名にしてしまうと、デバッガが効かなくなります。


ビルド後に実行するコマンドライン

set fname_bk=$(TargetName)_bk$(TargetExt)

move $(TargetFileName) %fname_bk%
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:$(TargetFileName) %fname_bk% *.dll



参考