今日はdllを実行ファイル(exe)に埋め込む方法を紹介します。
インストーラを配布して、アプリケーションをインストールする場合は、
C:\Program Files もしくは C:\Program Files (x86)に、
exeやdllを含めれば良いのですが、
要件によっては、インストールせずにexe単体で使いたい。
という要望がたまにあります。
など、想定できるケースは結構あります。
Visual Studio標準の機能では、上記機能を満たすことはできません。
「ILMerge.exe」というMicrosoft製のツールを使用します。
昔はMicrosoftから入手できたのですが、現在はGitに公開されています↓
GitHub:ILMerge.msi
公式からダウンロードした、ILMerge.msiをダブルクリックしてインストールします。
すべてデフォルトのまま進めて問題ないです。
実行しやすいよう、環境変数PATHに下記のインストールフォルダパスを登録しておきましょう。
C:\Program Files (x86)\Microsoft\ILMerge
次に、任意のディレクトリでテキストファイルを新たに作成し、
ファイル名を「ILMerge.exe.config」とします。
ファイルの中身は下記の通り記述してください。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<requiredRuntime safemode="true" imageVersion="v4.0.30319" version="v4.0.30319"/>
</startup>
</configuration>
作成したファイルをインストールフォルダに配置します。
(注)これを行わないと、.NET Framework4以降のライブラリを使用すると、うまくマージできません。
こんな例外がでます↓
An exception occurred during merging: Unresolved assembly reference not allowed: {アセンブリ名称} :
コマンドプロンプトでの基本構文は下記の通りです。
cdでマージしたいexe/dllフォルダに移動しておくと良いでしょう。
ILMerge.exe /wildcards /out:hoge-merge.exe hoge.exe *.dll
「/wildcards」は後方の「*.dll」にかかっており、
対象ディレクトリの、すべてのdllをマージするという意味です。
「*」を指定しても「/wildcards」を指定しないと動作しないことに注意してください。
「/out:hoge-merge.exe」がマージ後のファイル名を指定し、
「hoge.exe」がオリジナルのファイル名を指定します。
日本語で言うところ、
「hoge.exeにすべてのdllをマージして、hoge-merge.exeを作成して」
というところですね。
実際のサンプル
ILMerge.exe /wildcards /out:hoge-merge.exe hoge.exe *.dll /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6"
なんか増えてるじゃんよ?と思った方すみません。
「ILMerge.exe.config」の件もそうなのですが、
おそらく.NET Framework4以降で動作するようできておらず、オプションで対象フレームワークを指定せねばならないようです。
対象とするFrameworkのバージョンは、適宜変更してください。
Microsoft公式の公開日を見ると、
2012/08/06となっていたので、
旧Frameworkしか想定していないのかもしれません。
上記オプションをつけると、正常にマージしたexeができると思います。
実際に使用する場合は、Visual Studioでビルド後に実行すると思うので、
ビルドイベントに指定しておけば、毎回自動で作成してくれます。
プロジェクトのプロパティ ⇒ ビルドイベント ⇒ ビルド後イベントのコマンドライン
で下記のコマンドを設定してください。
ILMerge.exe /wildcards /out:$(TargetName)_merge.exe $(TargetFileName) *.dll /targetplatform:v4,"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6"
これでコマンドラインから実行せずとも毎回マージしたexeを作成してくれます。
最後に要点のみもう一度。
おわり。