Assembly.Load または Assembly.LoadFile を使用して、同じアセンブリの複数のバージョンを読み込むプロジェクトがあります。次に、Assembly.CreateInstance を使用して、その特定のアセンブリから型を作成します。
これは、私が作成しているタイプが別の依存アセンブリを参照するまでうまく機能します。この特定のアセンブリの要求をインターセプトして別のアセンブリをロードし、正しいバージョン (または、より適切にはプローブ パス) を提供して依存関係を探す方法が必要です。
これが必要なのは、Assembly.CreateInstance で作成しているアセンブリの v1 と v2 には、依存アセンブリの異なるバージョンも必要になることが多いためですが、v1 と v2 の両方が既定で同じディレクトリをプローブします。
AppDomain に対して一般的に行う方法の例を見てきましたが、特定のルート アセンブリからのすべての解決を処理する方法でこれを行う必要があります。私が次のようなことをすると仮定します:
AppDomain.CurrentDomain.AssemblyResolve += delegate(object sender, ResolveEventArgs args)
{
//Use args.RequestingAssembly to determine if this is v1 or v2 based on path or whatever
//Load correct dependent assembly for args.RequestinAssembly
Console.WriteLine(args.Name);
return null;
};
これは、ターゲット アセンブリによってすぐに参照される依存関係に対しては機能する可能性がありますが、それらの依存関係が参照するアセンブリについてはどうでしょうか? v1 がそれ自体が DepDepv1 を参照する Depv1 を参照する場合、それを正しく検出できるように、これを知る必要があります。
その場合、何らかの形でこれを追跡する必要があると思いました。おそらく、カスタム アセンブリの証拠を追加することによって - 私はそれを機能させることができませんでしたが、実行時に追加できる「アセンブリ メタ データ」プロパティはないようです。
特定のディレクトリからすべての依存関係を読み込むように特定のアセンブリに指示できれば、はるかに簡単になります。
アップデート
AssemblyResolve イベントを使用して、RequestingAssembly のパスに基づいて依存アセンブリを読み込むことができましたが、これには欠陥のあるアプローチのようです。使用されている依存アセンブリのバージョンは、たまたま最初にロードされたバージョンに完全に依存しているようです。
例えば:
- v1 をロード
- v2 をロード
- 参照 v1 が Depv1 の負荷を引き起こす
- リファレンス v2 が Depv2 の負荷を引き起こす
- v1 のコードは Depv1 の型を使用します (Works)
- v2 のコードは Depv2 の型を使用します <-- Depv1 から型を取得するため失敗します!
この時点ではステップ 5 と 6 のみを推測していますが、 Depv1 と Depv2 がロードされていることがわかります。