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

  • 84
    いいね
  • 0
    コメント

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


参考