2009-03-29 24 views
3

アセンブリを別のアセンブリにバンドルするベストプラクティスは何ですか?私は配布しているアセンブリがありますが、私が使用しているサードパーティのアセンブリが2つあり、複数を配布する必要はありません。メインアセンブリにバンドルされている組み込みアセンブリをどのように読み込みますか?

私はいくつかのアセンブリを私が配布しているアセンブリにコンパイルして、組み込みのものにしたいと思っています。

このためのベストプラクティスは何ですか?私は自分のプロジェクトに他のアセンブリを配置し、それらを「埋め込みリソース」に設定できることを知っていますが、どうやってそれらを取り戻すのでしょうか。つまり、組み込みアセンブリで定義されたクラスをインスタンス化できる場所にいかがですか?

私はAssembly.Loadメソッドを見ましたが、ファイルパスが必要なようです。組み込みアセンブリを読み込む別の方法はありますか?アセンブリがどこにあるかLoadメソッドにどのように伝えますか?

埋め込みアセンブリを読み込んだら、それは魔法のように範囲内にありますか、それからクラスを自由にインスタンス化できますか?

答えて

5

メモリアレイからアセンブリをロードするために使用できるオーバーロードはAssembly.Load(byte[])です。私が正しく覚えていれば、それは例えばLINQPadの方法です。ここでそれを行う方法は、管理対象リソースとして他のアセンブリを含む、アセンブリはSystem.Reflection.Assemblyのインスタンスであることを考えると、です:

Stream embedded = assembly.GetManifestResourceStream ("asm.dll"); 
byte [] buffer = new byte [embedded.Length]; 
using (embedded) { 
    int length = buffer.Length; 
    int offset = 0; 
    while (length > 0) { 
     int read = assemblyStream.Read (buffer, offset, length); 
     if (read == 0) 
      break; 

     length -= read; 
     offset += read; 
    } 
} 

Assembly assembly = Assembly.Load (buffer); 

この1の問題は、ランタイムはそう、バイト配列を固定しなければならないということですアセンブリを一時ファイルに書き出し、Assembly.LoadFileを使用することをお勧めします。

両方のメソッドはSystem.Reflection.Assemblyオブジェクトを返します。これらのオブジェクトを使用して型を取得し、必要なものを実行できます。

+0

実際にクラスを取得すると、これを超えたステップは何ですか?アセンブリをロードしてAssemblyオブジェクトを取得したら、そのクラス内で定義されているすべてのクラスがグローバルスコープにありますか? – Deane

+0

アセンブリが現在のAppDomainに読み込まれます。 Assembly.GetType()を使用して型を取得し、Activator.CreateInstanceを使用して型をインスタンス化できます。アセンブリが動的にロードされるので、型を動的にインスタンス化する必要があります。 –

5

ILMergeユーティリティは、元のアセンブリをリソースから読み込むのではなく、参照を修正することで、すべてのアセンブリを1つにまとめたユーティリティをお勧めします。