アプリケーションを開発しているとライブラリを利用する機会が多いですよね。
で、DLLを利用した開発も多いかと思いますが、ちょっと規模の大きな開発になるとリンクするDLLの数が多くなりますよね。
私も先日開発したアプリケーションで15個くらいのDLLを使うアプリケーションを作ったのですが、メインのEXEファイルがフォルダ内に埋もれてしまい、ユーザーにEXEを探してもらう作業が必要になってしまいました。
今回は、そんなDLLをEXEにひとまとめにしてしまう方法(ILMerge)を勉強したので紹介します。
まずILMergeですが、これはMicrosoftが無償で提供しているツールになります。(ダウンロードは←のリンク先です)
コマンドラインベースで操作し、ライブラリと実行ファイルを実行ファイルにひとまとめににすることができます。
全てのDLLをまとめることも、特定のDLLだけを組み込むこともできます。
なので、複数の実行ファイルからリンクするDLLは残し、1つの実行ファイルからしかリンクしないDLLは全てこの実行ファイルに同梱してしまうとフォルダ内がスッキリします。
【使い方】
まずは、こちらからインストーラをダウンロードしてインストールします。
使い方はコマンドプロンプトでコマンドを入力して使用します。
基本的なコマンドは次のような感じ。
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /out:out.exe in.exe tmp1.dll tmp2.dll
1つ目はILMerge.exeのパス、2つ目は出力オプションと出力ファイル名、3つ目はベースとなるexeファイル名、以降はマージするdllファイル名を入力します。
これを実行すると、コマンドを実行したディレクトリ上にマージされたout.exeが出力されます。
ワイルドカードでマージするdllを指定することもできます。
これだと一つ一つdllを入力するのではなく、一回のコマンドでマージすることができます。
"C:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" /wildcards /out:out.exe in.exe *.dll
ワイルドカードを使用する場合は、必ずwildcardsオプションを付加する必要があります。
これを指定しないとエラーになるのでご注意ください。
【Visual Studioでの使い方】
ビルドした後で毎回コマンドを実行するのは面倒ですよね。
Visual Studioでの開発では、ビルドの際にビルドイベントを設定することができます。
なので、ビルド後イベントに上記のコマンドを設定しておくことでビルドとマージを一気に片付けることができます。
その際のポイントがあります。
マージする前に一度ファイルをリネームしておくことです。
ren in.exe tmp.exe
というような感じで実行することができます。
これは、出力後のファイルをビルドしたexeのファイル名と同じようにするためです。
あと、リリースしやすいようにdelコマンドでマージに使ったdllファイルも削除しておくと便利ですよ。
del /Q *dll
これでビルドと同時にDLLをマージすることができるようになりました。
EXEファイルがDLLに埋もれることもなくなりました。
世の中便利なものもあるものですねー。
コメント