Windows Formsアプリケーションをユーザーに配布する際、複数のDLLファイルを一緒に提供するのは運用上の課題です。依存関係の管理やバージョン不整合による実行エラーを回避するため、すべてのアセンブリを1つのEXEファイルに統合する手法が求められます。Costura.Fodyは、ビルド時にILコードを自動変換してアセンブリを埋め込む軽量かつ信頼性の高いソリューションです。
Costura.Fodyの動作原理
Fodyは、.NETプロジェクトのコンパイル後フェーズでMSIL(中間言語)を操作する拡張フレームワークです。Costura.Fodyはそのプラグインの一つで、bin\Release以下に配置される参照DLLを、出力EXEのリソースとして埋め込み、アプリ起動時にランタイムで動的にロードします。このプロセスは完全に自動化され、ソースコードの変更やカスタムローダーの実装は不要です。
導入手順(Visual Studio 2022以降)
- ソリューションエクスプローラーでプロジェクトを右クリック → 「NuGetパッケージの管理」を選択
- 以下の2つのパッケージをインストール:
Fody(v6.x以上)Costura.Fody(v5.x以上)
- プロジェクト直下に
FodyWeavers.xmlファイルを作成し、以下を記述:
<?xml version="1.0" encoding="utf-8"?>
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<Costura />
</Weavers>※ Visual Studioでは「すべてのファイルを表示」ボタンをオンにしてからファイルを追加してください。
不要な出力ファイルの自動削除
埋め込み後、デバッグ用ファイル(PDB)、設定ファイル(.config)、XMLドキュメント(.xml)などは実行に不要なため、Post-buildイベントでクリーンアップできます。プロジェクトのプロパティ → 「ビルド イベント」タブ → 「後処理コマンド ライン」に次を入力:
del "$(TargetDir)*.pdb" del "$(TargetDir)*.xml" del "$(TargetDir)*.config" if exist "$(TargetDir)$(ProjectName).deps.json" del "$(TargetDir)$(ProjectName).deps.json"
留意点
- 起動時間の増加:埋め込みDLLの展開・ロードはメインスレッドで行われるため、特に多数の依存がある場合、初回起動が若干遅くなります。
- ネイティブDLLの制限:Costura.FodyはマネージドDLLのみ対応。C++/CLIやUnmanaged DLL(例:SQLite.Interop.dll)は別途配置または自前ロードが必要です。
- 署名済みアセンブリとの互換性:強名付き(Strong-Named)DLLを埋め込むと、検証失敗を引き起こす可能性があります。必要に応じて
<Costura IncludeDebugSymbols='false' />等のオプションで調整可能です。 - ライセンス遵守:埋め込み対象のライブラリがGPLなどのCopyleftライセンスを採用している場合は、再配布条件を確認し、適切なクレジット表示やソース提供を行う必要があります。