[ILMerge]DLLをEXEにまとめて1つにする・ビルド後の自動マージ

2017-01-21

ILMergeを用いることで、EXE内にDLLを格納する等、アセンブリファイルをまとめることができる。

 

1.ILMergeのダウンロード・インストール

下記サイトよりILMergeをダウンロードし、インストールを行う。

Download ILMerge from Official Microsoft Download Center

ここでは「C:Program Files (x86)MicrosoftILMerge」にインストールしたものとし、解説をする。

 

2.ILMergeの実行

ILMergeを実行すると、下記のヘルプが表示される。

C:Program Files (x86)MicrosoftILMerge>ILMerge.exe
Usage: ilmerge [/lib:directory]* [/log[:filename]] [/keyfile:filename [/delaysign]] [/internalize[:filename]] [/t[arget]:(library|exe|winexe)] [/closed] [/ndebug] [/ver:version] [/copyattrs [/allowMultiple] [/keepFirst]] [/xmldocs] [/attr:filename] [/targetplatform:<version>[,<platformdir>] | /v1 | /v1.1 | /v2 | /v4] [/useFullPublicKeyForReferences] [/wildcards] [/zeroPeKind] [/allowDup:type]* [/union] [/align:n] /out:filename <primary assembly> [<other assemblies>…]

基本的な使い方は、「/out:」にマージしたファイルの出力先パスを、「primary assembly」にメインとなるファイル、「other assemblies」にマージしたいファイルを指定する。

publicな修飾子をinternalに変更したいときは、「/internalize」を指定する。
しかし、これによりマージ後のアプリケーションが正常に動作しなくなる(参照エラー)恐れもあるため、テストは十分に行うこと。

pdbファイルを生成しないようにするには「/ndebug」を指定する。

.NetFrameworkを用いたアセンブリの場合は、「/targetplatform:」に.Net Frameworkのバージョン または プラットフォームディレクトリを指定する。
.NetFramework4.5.2の場合は下記のようになる。
/targetplatform:"v4,C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5.2″

「other assemblies」に、全てのファイルを列挙するのではなく、ワイルドカードを用いて指定することもできる。
その場合は「/wildcards」を指定する。

使用例

ILMerge.exe /internalize /ndebug /targetplatform:"v4,C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5.2" /wildcards /out:MargeProject.exe ReleaseProject1.exe Release*.dll

 

出力先を異なるディレクトリにする場合は、事前にディレクトリを用意しておくこと。
ディレクトリの自動生成はされず、エラーとなる。

 

3.VisualStudioのビルド後に、自動的にILMergeを実行する

3.1.各プロジェクトのビルド出力先を同一の場所にする

プロジェクトの初期値では、プロジェクトのフォルダ内にBinフォルダが作られ、ビルドされたアセンブリファイルが置かれる。
これを、各プロジェクトが同一のフォルダにアセンブリファイルを出力するように変更する。
注意:指定対象は全てのプロジェクト

 

3.2.メインプロジェクトのビルドイベントのビルド後のコマンドラインにILMergeのコマンドを記載する

注意:指定対象はメインのプロジェクトのみ

記載例

if $(ConfigurationName) == Release (
	del /S /Q "$(TargetDir)Marge*.*"
	md "$(TargetDir)Marge"
	"C:Program Files (x86)MicrosoftILMergeILMerge.exe" /internalize /ndebug /targetplatform:"v4,C:Program Files (x86)Reference AssembliesMicrosoftFramework.NETFrameworkv4.5.2" /wildcards /out:"$(TargetDir)Marge$(TargetName)$(TargetExt)" "$(TargetDir)$(TargetName)$(TargetExt)" "$(TargetDir)*.dll"
)

記載例解説
if $(ConfigurationName) == Releaseを指定することにより、リリースビルド時のみ実行する設定となる。
ILMergeは、3.1.にて指定したディレクトリ内のMargeディレクトリに、プロジェクトのEXEと同名の、DLLを全てマージしたEXEを生成する。
パスは全てダブルクォーテーションで囲う。

 

3.3.プロジェクトをビルドする