2011-07-07 16 views
7

私は自分のコードを呼び出すときにアセンブリAをロードする必要があるサードパーティのライブラリを持っています。そのアセンブリは、通常、GACにインストールされているので、私はそれをロードするには、いくつかのオプションがあります。参照アセンブリを強制的にロードする必要がありますか?

  1. 私は明示的にAssembly.Load()を呼び出すことができます。しかし、それは私のプログラムでハードコードに慣れていないと感じる完全な名前が必要です。
  2. Assembly.LoadWithPartialName()を明示的に呼び出すことができます。これはもちろん廃止APIです。もちろん、バージョン管理のコントロールを失うのは快適ではありません。
  3. Visual Studioプロジェクトファイルでアセンブリを参照できるため、常にビルドしたバージョンを取得できます。ただし、そのアセンブリ内にダミーオブジェクトを作成しない限り動作しません。私がしなければ、C#コンパイラは単にそれを無視します。
  4. Assembly.GetReferencedAssembliesを呼び出して、一致するものを強制的にロードすると同じ問題が発生します。 C#コンパイラは参照リストに入れてもアセンブリを参照しません。

私がやっていることは、typeof(A.Foo).Assembly.GetName()を呼び出して戻り値を無視することです。それを行うより良い方法はありますか?

+0

オプション#1ではどうですか?しかし、アセンブリのフルネームはapp.configファイル)?あなたが望むアセンブリの明示的な負荷ですが、再コンパイルせずに更新する柔軟性は – dkackman

+0

@dkackmanにする必要があります。これは手動でも更新する必要があります。私はVisual Studioにバージョンコントロールから現在のバージョンを拾いたかったので、時間や実行時間をコーディングするのではなく、ビルド時にバージョンを取得しました。 –

+0

@focey - hmmm、魚臭いですが...ビルド後のステップですか?アセンブリを取得し、バージョンを削除し、設定ファイルに書き込みますか?おそらく、ちょうどあなたがやっていることをやっているのは私が気に入っていませんが、 – dkackman

答えて

1

オプション1は、私にとってVSプロジェクトで参照することです。

しかし、よりパッシブなアプローチが必要な場合は、AppDomain.CurrentDomain.AssemblyResolveイベントハンドラを使用できます。 AppDomainに見つからないアセンブリが必要な場合に実行されます。イベントの引数は、探しているアセンブリを教えてくれるでしょう。Assembly.Load()を使ってその時点でそれをつかむことができます。

+1

ありがとうございます - 残念ながら、第三者のライブラリは 'AppDomain.CurrentDomain.GetAssemblies()'を呼び出し、必要なものが見つからなかった場合にスローします。 –

+3

@focey - それは駄目だよ。 – dkackman

+0

完全に突っ込む! –

関連する問題