C#

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

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

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

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

Visual Studioの標準機能では、上記に記したことを実現できません。
そこで「Costura.Fody」を利用することで、アプリケーションを実行するのに必要な複数のDLLファイルを1つのEXEファイルにまとめることが可能になります。

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

環境

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

Costura.Fodyのインストール

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

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 Studio2017で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」でも実現することができます。ただ、ビルドイベントにコマンドを追加する必要があったりと手間がかかることがあります。

個人的にはILMergeより使い勝手がいいと思うので、代替のパッケージとして利用してみてはいかがでしょうか。

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

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA