9
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C#・WPF備忘録】exeにdllを埋め込む方法3つ試した

Last updated at Posted at 2023-11-13

仕事で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を埋め込むことができました(´;ω;`)♡

ご自身の開発環境ややりたいことに合わせて方法を選んでみて下さい。

9
21
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?