Visual C# で、自作のクラスライブラリと実行ファイルを一つにまとめる(静的リンクもどきを行う)やり方です。
Microsoftが提供しているツール「ILMerge」で複数のアセンブリを一つのアセンブリにマージできます。
このツールを使うことで、自作のクラスライブラリのDLLと実行ファイルを一つにまとめることができます。
ILMergeの使い方
インストール後、コマンドプロンプトでこんな感じにコマンド打てばexeとDLLをマージしてくれます。
"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 を追加します。
"C:¥Program Files¥Microsoft¥ILMerge¥ILMerge" /wildcards /out:hoge_merge.exe hoge.exe *.dll
ちなみに /wildcards を指定せずに実行するとエラーになります。
"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
## 参考 - アプリケーションのEXEファイルやDLLファイルを1つにまとめるには? - @IT http://www.atmarkit.co.jp/fdotnet/dotnettips/426ilmerge/ilmerge.html
- Download: ILMerge - Microsoft Download Center - Download Details
http://www.microsoft.com/en-us/download/details.aspx?id=17630