> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】FodyでDLLファイルをEXEファイルに埋め込む方法

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

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

DLL ファイルが含まれていないと、実行ファイルが起動しない・正常に動作しない等の不具合が発生する可能性があります。

不具合が発生しないようにアプリケーションをユーザーに配布する場合は、ファイルの数は少なくした方が好ましいでしょう。究極的には実行ファイル1つだけ配布したいものです。

Visual Studio の標準機能では、上記に記したことを実現できません。

そこで「Costura.Fody」を利用することで、アプリケーションを実行するのに必要な複数の DLL ファイルを1つの EXE ファイルにまとめることが可能になります。

\ Costura.Fodyサイトへ /

DLLをまとめる便利なライブラリ!!

本記事では Costura.Fody を用いて、DLL ファイルを実行ファイルに埋め込む方法を紹介します。

環境

項目内容
OSWindows10
IDEVisual Studio 2017
フレームワーク.NET Framework 4.8
UIフレームワークWPFアプリ

オススメの参考書

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

Costura.Fodyのインストール

Microsoft Visual Studio から任意のプロジェクトを開きます。

STEP
NuGetパッケージ マネージャを開く

ソリューションエクスプローラーの中にあるプロジェクト名を選択して右クリックをすると、表示される項目の中にある「NuGetパッケージの管理(N)…」をクリックします。

STEP
Costura.Fodyをインストールする

NuGetパッケージマネージャーが開くので、検索欄に「Fody」と入力して検索します。検索結果一覧の中にある「Costura.Fody」を選択して、パッケージをインストールします。

インストールする際、IDE(Visual Studio2017 もしくは Visual Studio2019)に応じてバージョンを選択する必要があります。

IDECostura.Fodyのバージョン
Visual Studio20173.3.3以下
Visual Studio20194.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以上をインストールした時のエラー写真です。

STEP
インストールの完了を確認する

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 より使い勝手がいいと思うので、代替のパッケージとして利用することをおススメします。

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

よかったらシェアしてね!
  • URLをコピーしました!