Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
140
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@krsak

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

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


参考

140
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
140
Help us understand the problem. What is going on with this article?