.net

【.net】dllをexeに埋め込む方法(2018年版)

今日はdllを実行ファイル(exe)に埋め込む方法を紹介します。

インストーラを配布して、アプリケーションをインストールする場合は、
C:\Program Files もしくは C:\Program Files (x86)に、
exeやdllを含めれば良いのですが、
要件によっては、インストールせずにexe単体で使いたい。
という要望がたまにあります。

  • USBメモリ等、外部ストレージから直接起動したい
  • インストール不可の環境で実行したい
  • 一時使用のため、インストールしてまで使いたくない

など、想定できるケースは結構あります。

Visual Studio標準の機能では、上記機能を満たすことはできません。
「ILMerge.exe」というMicrosoft製のツールを使用します。


ILMergeのダウンロード

2018/10/01現在 Microsoft公式からダウンロードできます。

Microsoft公式:ILMergeダウンロードページ
上記のページは削除されたようです。
有志が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を作成してくれます。

最後に要点のみもう一度。

  • ILMerge.exe.configを作成する
  • /targetplatformオプションをつける

おわり。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です