仕事でC#アプリケーションを開発していたら、exeファイル単体でどこでも好きな場所に配置して実行できるようにしたいという要望がありました。
しかしそのアプリはdllを複数参照していて、通常なら exeと同じ階層にdllを配置していないと動きません。
そこでexeにdllを埋め込むような形で単一で動作するexeファイルの作成方法を調査しました。
開発環境
C# 6.0
.NET Framework 4.6.2
Visual Studio 2015
WPF
少し古い環境でしょうか。。でも仕事だとこんなこと結構ありますよね(?)
次に紹介する3つの方法のうち、ネット検索でたくさんヒットする1つ目と2つ目の方法では動作せず、途方に暮れていました…。
exeにdllを埋め込む方法3つ
1. Costura.Fodyを使う方法
Costura.Fodyは3つの中で最新の方法です。
Nugetパッケージをインストールするだけで環境が整うので手軽です。
(設定をカスタマイズしたい場合はプロジェクト直下に FodyWeavers.xml を作成する必要があります。)
ビルドするとdllが生成されず、exeの中に埋め込まれる!
…ということですが私の環境で行ったところ、残念ながら埋め込まれませんでした。
参考記事では Visual Studio 2017 以上を前提としていますが、私の環境は Visual Studio 2015。Costura.Fodyは古いバージョンの Visual Studio には非対応なのかもしれないと思いました。
2. ILMergeを使う方法
ILMergeは旧来から存在する方法です。
Nugetパッケージとソフトウェアの2つの形式があり、好きなほうを選択できます。
※ソフトウェアとしてインストールする場合、【こちらのGitHubページ】で"Raw"をクリックするとmsiをダウンロードできます。
ILMergeを使うにはビルド後にコマンドを実行する必要があります。(自動化は可能)
コマンドを実行すると、ビルドで生成されたファイルをもとに、exeがもう1つ生成されます。これにはdllが埋め込まれています。
私の環境で試してみると、このexeは生成されたものの、実行してみると「リソース"View/MainView"を検索できません。」というエラーが発生してしまいアプリを起動できませんでした。
その後こちらの記事で、ILMergeはWPFでは使えないということを知りました。XAMLリソースに対応していないということですが、上記のエラーも確かにそれっぽい内容です。
3. 埋め込みリソースにする方法
dll以外の拡張子のファイルもexeに埋め込むことができる万能な方法です。
しかも環境設定も、やってみると思ったより簡単。
Nugetパッケージのインストールが不要な点も良いかも。
① csprojファイルに、参考記事どおりコピペする。
② Program.csを作成し、参考記事どおりコピペする。(足りないパッケージはusing必要)
③ プロジェクトの設定で、スタートアップオブジェクトにProgram.csを指定する。
ビルドするとdllも生成され、一見いつも通りに思えますが、exeにはdllが埋め込まれています。これをデスクトップに配置して実行すると見事正常に動作しました!
というわけで埋め込みリソースにする方法でなら、Visual Studio 2015 / WPF の環境でもexeにdllを埋め込むことができました(´;ω;`)♡
ご自身の開発環境ややりたいことに合わせて方法を選んでみて下さい。