.NET アプリを作っていると、参照する自作アセンブリが増えてきました。そこで、複数のアセンブリを実行ファイルとマージする(まとめる)ために、ILMerge を試しました。また、public なクラスなどのアクセス修飾子を internal に変更して、外部から参照できないようにできるので、そちらも試してみました。
もくじ
ILMerge の入手方法
下記のサイトからダウンロードできます。
実行方法
例として、C:\TestSolution
ソリューション内の App.exe
と Common.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)
などのマクロは、コマンド実行時に展開されます。