実行ファイル(.exe)とdllをまとめる方法について

.net環境でexeとdllをまとめる方法について

  • ILMarge
  • Fody/Costura

のそれぞれについて軽くメモ

 

ILMarge

''exe dll まとめる''

等で検索するとだいたいILMargeでの方法が載っています。

ILMargeについてはgoogle先生や以下のページが詳しいので割愛。

アプリケーションのEXEファイルやDLLファイルを1つにまとめるには? - @IT

 

ILMargeの良いところとして、MS純正ツールなのもポイント高いです。 

ただ以前、自分の環境で試したときにデバッグが上手くいかないことがあって、

使えないーということがありました。

多分設定があるのでしょうが、その時は簡単には見つからず…。

実行ファイルとDLLを一つにまとめる - Qiita

次のようにマージ後のファイル名を元のファイル名にしてしまうと、デバッガが効かなくなります

これな気がします…。

 

あと、

  • マージがエラーになったときに原因が解りにくい
  • ビルド後イベントを追加する必要がある

等々もあって脳死で使えるほど簡単ではないなぁという。

 

Fody/Costura

github.com

最近Fody.PropertyChangedというライブラリを知って色々調べているうちにこちらを発見。

使ってみるととても簡単にexeとdllをまとめることができました。

 

使い方は

  1. nugetでCostura.FodyとFodyをインストール
  2. FodyWeavers.xmlをプロジェクトと同じディレクトリ内に作成
    ⇒他の紹介記事だとこの手順がないので自動生成される方法があるのかも?
  3. 以下の内容をコピペして保存

    <?xml version="1.0" encoding="utf-8"?>
    <Weavers>
      <Costura/>
    </Weavers> 

  4. ビルド

と、とても簡単。

ただ、まとめるdllによってはFodyWeavers.xmlにいくつか設定が必要になってきます。

 

特定のアセンブリを除外する

除外するアセンブリを<ExcludeAssemblies>~</ExcludeAssemblies>に書くだけです。

kagasu.hatenablog.com

上手くマージできないdllがあったらとりあえずこれで解決できます。

その分exeとは別のdllが増えていきますが…。

x86/x64のアンマネージドなdllがあるアセンブリについて

ちょっとまだ試せてないですが

<Unmanaged32Assemblies>~</Unmanaged32Assemblies>

<Unmanaged64Assemblies>~</Unmanaged64Assemblies>

で囲めばいけるようです。

Putting DLLs Into a Single WPF Exe 

(と思ったけど、実際試すと別に囲んでも囲わなくても動くような…?)