Visual Studio で NuGet にあるパッケージを活用してアプリケーションを作成した場合、DLL ファイルを実行ファイル( EXE ファイル)があるフォルダに含める必要があります。

DLL ファイルが含まれていないと、実行ファイルが起動しない・正常に動作しない等の不具合が発生する可能性があります。
不具合が発生しないようにアプリケーションをユーザーに配布する場合は、ファイルの数は少なくした方が好ましいでしょう。究極的には実行ファイル1つだけ配布したいものです。
Visual Studio の標準機能では、上記に記したことを実現できません。
そこで「Costura.Fody」を利用することで、アプリケーションを実行するのに必要な複数の DLL ファイルを1つの EXE ファイルにまとめることが可能になります。
\ Costura.Fodyサイトへ /
DLLをまとめる便利なライブラリ!!
本記事では Costura.Fody を用いて、DLL ファイルを実行ファイルに埋め込む方法を紹介します。
環境
項目 | 内容 |
---|---|
OS | Windows10 |
IDE | Visual Studio 2017 |
フレームワーク | .NET Framework 4.8 |
UIフレームワーク | WPFアプリ |

オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
Costura.Fodyのインストール

Microsoft Visual Studio から任意のプロジェクトを開きます。
ソリューションエクスプローラーの中にあるプロジェクト名を選択して右クリックをすると、表示される項目の中にある「NuGetパッケージの管理(N)…」をクリックします。
NuGetパッケージマネージャーが開くので、検索欄に「Fody」と入力して検索します。検索結果一覧の中にある「Costura.Fody」を選択して、パッケージをインストールします。

インストールする際、IDE(Visual Studio2017 もしくは Visual Studio2019)に応じてバージョンを選択する必要があります。
IDE | Costura.Fodyのバージョン |
---|---|
Visual Studio2017 | 3.3.3以下 |
Visual Studio2019 | 4.0.0以降 |
IDE によって MSBuild のバージョンが異なり、これが原因でビルドした時にエラーが発生します。
「Fody is only supported on MSBuild 16 and above.Current version: 15.」
「Fody は、MSBuild 16 以降でのみサポートされています。現在のバージョン:15。」

上図は Visual Studio 2017 で Costura.Fody のバージョン4.0.0以上をインストールした時のエラー写真です。
Costura.Fodyをインストールすると、依存関係にある「Fody」が自動的にインストールされます。

Costura.Fodyの使い方

使い方はビルドするだけなのでとても簡単です。さっそくビルドしてみましょう。
下図は「Costura.Fody」を使用する前と使用した後を比較した画像です。使用後のフォルダにはDLLファイルがなくなっていることが分かります。

ファイルサイズも比較してみましょう。使用前と比較してファイルサイズが約4110KB程度増えています。これは DLL ファイルが実行ファイルに埋め込まれた為ですね。

オプション設定
Costura.Fody は特定の DLL ファイルを除外して、実行ファイルに埋め込みを行うことできます。上記に記載した設定を行うにはプロジェクトに「FodyWeavers.xml」という名前で新規のファイルを作成します。

先ほど作成したファイルに以下のコードを記述します。このCosturaタブに追加したいオプションを記述します。
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura/>
</Weavers>
特定のDLLファイルを除外
例えば「NLog.dll」というファイルは埋め込みしたくない場合は、以下のように記述をします。
ここで注意しなければならないのは、除外したいDLLファイルの拡張子(.dll)をつけずにファイル名のみで指定する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura>
<ExcludeAssemblies>
NLog
</ExcludeAssemblies>
</Costura>
</Weavers>
これを実行すると、先ほど除外した DLL ファイルだけ埋め込みされていないことが分かります。

特定のDLLファイルを埋め込み
先ほどとは逆に「NLog.dll」というファイルは埋め込みたい場合は、以下のように記述をします。
同様に埋め込みたいDLLファイルの拡張子(.dll)をつけずにファイル名のみで指定する必要があります。
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura>
<IncludeAssemblies>
NLog
</IncludeAssemblies>
</Costura>
</Weavers>
これを実行すると、先ほど指定したDLLファイルだけ埋め込みされていることが分かります。

まとめ

DLL ファイルを実行ファイルに埋め込む方法は、Microsoft が提供しているツール「ILMerge」でも実現することができます。ただ、ビルドイベントにコマンドを追加する必要があったりと手間がかかることがあります。
個人的には、Costura.Fody は ILMerge より使い勝手がいいと思うので、代替のパッケージとして利用することをおススメします。



以上、最後まで読んでいただきありがとうございました。