ILMergeは、複数のアセンブリをひとつのアセンブリに統合することができ、型の可視性をpublic
からinternal
に変更することができる.NETのユーティリティである。これは、作成されたアセンブリがどのように使われるようになるかによって、肯定的にも否定的にもすることができる。
ILMergeは、誰かが作成したフレームワークやアプリケーションとそれが依存するすべてのフレームワークやライブラリを一緒にすることで、ユーザから隠すことができ、インストールして使うことが簡単にできるようになる。ILMergeは、コマンドプロンプトやプログラムから使用することができる。設定可能なプロパティのひとつに、型を非表示であるinternal
にするInternalize
がある。
マイクロソフトのソリューションアーキテクトMVPでありNServiceBusの父であるUdi Dahan氏は、バージョン1.9でILMergeを使用して、NServiceBusが依存するすべてアセンブリを統合したが、いかなる型もinternalize(Internal化)しなかった。
すべてのサードパーティの型は、開発者がNServiceBusを使うときに公開される。これは、マージされたものと同じバージョンのライブラリを仕様する時には問題が発生しない。残念ながら、Castleのようなライブラリを使用する開発者は、「バージョニング地獄」としても知られるバージョン競合が発生することがあります。
NServiceBus 2.0で、Dahan氏は、Internal化の機能を使い始めた。しかし、彼はすべての型をInternal化するべきでないと述べている。
たとえばNServiceBusは、長期実行プロセス(sagasと呼ばれる)の状態を永続化の内部でNHibernateを使用しています。そして、私たちはNServiceBus上で開発者がやりたいと思うことをなにとも競合することなく行えるようにして欲しいと考えています。NHibernateの作業において、ただひとつ必要なことは、環境の構成において、NHibernate.Cfg.MappingSchema名前空間のすべての型が公開されていることです。
ユーザの一部は、バンドルされているライブラリのAPIにアクセスしたいと考えるだろうが、彼らはすべてをinternal
にしたいとは考えないだろう。そのため、いくつかは彼らのように型を開放する方がよいだろう。NServiceBusは、現実的な解決策として2つのビルドを提供している。ひとつは、一般的なユーザが望んでいるフレームワークのみを使うもの、そして他のビルドは、コアバイナリに含まれていて、完全なコントロールを提供するものである。
ILMergeは、.NET Framework 2.0以降とすべてのマージする.NETアセンブリは、.NET 1.0/1.1で作成されている必要がある。ツールは、Windows上でのみ動作して、RotorやMonoはサポートされていない。