ILMerge を使ってアセンブリを 1 つにまとめる

.NET アプリを作っていると、参照する自作アセンブリが増えてきました。そこで、複数のアセンブリを実行ファイルとマージする(まとめる)ために、ILMerge を試しました。また、public なクラスなどのアクセス修飾子を internal に変更して、外部から参照できないようにできるので、そちらも試してみました。

ILMerge の入手方法

下記のサイトからダウンロードできます。

実行方法

例として、C:\TestSolution ソリューション内の App.exeCommon.dll をマージして AppMerged.exe を作成することにします。

マージ対象のファイル
マージ対象のファイル

下記のコマンドを実行します。

%PROGRAMFILES(X86)%\Microsoft\ILMerge\ILMerge
/targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1"
/out:"C:\TestSolution\App\bin\debug\AppMerged.exe"
"C:\TestSolution\App\bin\debug\AppMerged.exe"
"C:\TestSolution\App\bin\debug\Common.dll"
/internalize
  • 2 行目:今回は対象のフレームワークが .NET 4.5.1 なので、このように指定しています。別のバージョンなら、指定を変更する必要があります。
  • 3 行目:複数のアセンブリがマージされた結果、作成されるアセンブリのパスを指定します。
  • 4,5 行目:マージ対象のアセンブリのパスを指定します。たくさんある場合は行を増やして指定できます。
  • 6 行目:public なアクセス修飾子を、internal に変換する場合の指定。変換しないなら、この指定は不要です。

ビルドのたびに実行する

MSBuild プロジェクト上で、ビルド イベントのビルド後に実行するコマンドラインに設定しておくと、ビルドのたびに自動でマージが行われるので便利です。

%PROGRAMFILES(X86)%\Microsoft\ILMerge\ILMerge
/targetplatform:"v4,C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1"
/out:"$(TargetDir)$(TargetName)Merged$(TargetExt)"
"$(TargetPath)"
"$(TargetDir)Common.dll"
/internalize

$(TargetDir) などのマクロは、コマンド実行時に展開されます。

kpdn

お寿司とゲームと動物が好きな、フリーランスのエンジニアです。フロントエンドからインフラまで日々奮闘中です。最近は物忘れがどんどんがひどくなってきました。

コメントを残す