Visual StudioでNuGetにあるパッケージを活用してアプリケーションを作成した場合、DLLファイルを実行ファイル(EXEファイル)があるフォルダに含める必要があります。
DLLファイルが含まれていないと、実行ファイルが起動しない・正常に動作しない等の不具合が発生する可能性があります。
不具合が発生しないようにアプリケーションをユーザーに配布する場合は、ファイルの数は少なくした方が好ましいでしょう。究極的には実行ファイル1つだけ配布したいものです。
Visual Studioの標準機能では、上記に記したことを実現できません。
そこで「Costura.Fody」を利用することで、アプリケーションを実行するのに必要な複数のDLLファイルを1つのEXEファイルにまとめることが可能になります。
本記事ではCostura.Fodyを用いて、DLLファイルを実行ファイルに埋め込む方法を紹介します。
環境
OS | Windows10 |
IDE | Visual Studio 2017 |
フレームワーク | .NET Framework 4.8 |
UIフレームワーク | WPFアプリ |
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 Studio2017でCostura.Fodyのバージョン4.0.0以上をインストールした時のエラー写真です。
Costura.Fodyをインストールすると、依存関係にある「Fody」が自動的にインストールされます。
Costura.Fodyの使い方
使い方はビルドするだけなのでとても簡単です。さっそくビルドしてみましょう。
下図は「Costura.Fody」を使用する前と使用した後を比較した画像です。使用後のフォルダにはDLLファイルがなくなっていることが分かります。
ファイルサイズも比較してみましょう。使用前と比較してファイルサイズが約4110KB程度増えています。これはDLLファイルが実行ファイルに埋め込まれた為ですね。
オプション設定
Costura.Fodyは特定のDLLファイルを除外して、実行ファイルに埋め込みを行うことできます。上記に記載した設定を行うにはプロジェクトに「FodyWeavers.xml」という名前で新規のファイルを作成します。
<?xml version="1.0" encoding="utf-8" ?>
<Weavers>
<Costura/>
</Weavers>
特定のDLLファイルを除外
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura>
<ExcludeAssemblies>
NLog
</ExcludeAssemblies>
</Costura>
</Weavers>
これを実行すると、先ほど除外したDLLファイルだけ埋め込みされていないことが分かります。
特定のDLLファイルを埋め込み
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<Costura>
<IncludeAssemblies>
NLog
</IncludeAssemblies>
</Costura>
</Weavers>
これを実行すると、先ほど指定したDLLファイルだけ埋め込みされていることが分かります。
まとめ
DLLファイルを実行ファイルに埋め込む方法は、Microsoftが提供しているツール「ILMerge」でも実現することができます。ただ、ビルドイベントにコマンドを追加する必要があったりと手間がかかることがあります。
個人的にはILMergeより使い勝手がいいと思うので、代替のパッケージとして利用してみてはいかがでしょうか。
以上、最後まで読んでいただきありがとうございました。
コメント