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

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

  • URLをコピーしました!

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

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

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

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

GitHub
GitHub - Fody/Costura: Embed references as resources Embed references as resources. Contribute to Fody/Costura development by creating an account on GitHub.

本記事では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」という名前で新規のファイルを作成します。

先ほど作成したファイルに以下のコードを記述します。この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より使い勝手がいいと思うので、代替のパッケージとして利用してみてはいかがでしょうか。

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

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

この記事を書いた人

プログラムが大好きなパンダです。
主に C# を使ってデスクトップアプリやモバイルアプリなどを開発しています。

当ブログでは C# の使い方や WPF または .NET MAUI を使ったサンプルアプリなど発信しています。

コメント

コメントする

CAPTCHA


記事の内容