6

私は過去数週間にわたってこれをクラックしようとしてきましたが、まだ良い解決策を見つけていません。うまくいけば、ここで答えを得ることができます。

2 つのアセンブリ (ZA & ZB) があり、どちらも共通のプロジェクト/dll (ZC) を指していますが、バージョンが異なる可能性があります (つまり、同じ dll 名、同じ名前空間、一部のクラスが異なる場合があります)。各アセンブリは単独で機能しますが、実行時に一方が他方によってロードされると (たとえば、A が B をロードする)、それを機能させることができません。助けが要る。

セットアップは次のとおりです。

  • ZA は ZC (共通) バージョン 1.1 に依存します。
  • ZB は ZC バージョン 1.0 に依存します

ZA はロードする必要があり、実行時に ZB (ZC に依存) に何かをロードする必要があります。

ZA はマスター アプリです。そのディレクトリの下に、すべての ZB とその依存関係 (ZC) を配置したいbinplugins ディレクトリがあります。plugins/plugin-ZB

これが私がこれまでに試したことです:

Assembly.Load()同じバージョンの dll を使用 - 正常に動作しました。

Assembly.Load()異なるバージョンの dll を使用すると、ZB が読み込まれますが、メソッドを実行すると、メソッドが見つからないという例外が発生します。

AppDomain.Load()ファイルが見つからないというエラーが発生しました。デリゲートを使用してアセンブリを解決することさえしました。

ZC に関するいくつかの詳細: - 一部のメソッドは public static です (一部はそうではありません)。例Log.Log("hello"); - 一部は値を返す場合があります (プリミティブまたはオブジェクト)。- 一部のメソッドは非静的 (および戻り値) です。

ヘルプ?-ティア

4

3 に答える 3

3
    m_Assembly1 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "Old Version\Some.dll"))
    m_Assembly2 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "New Version\Some.dll"))

    Console.WriteLine("Old Version: " & m_Assembly1.GetName.Version.ToString)
    Console.WriteLine("New Version: " & m_Assembly2.GetName.Version.ToString)

    m_OldObject = m_Assembly1.CreateInstance("FullClassName")
    m_NewObject = m_Assembly2.CreateInstance("FullClassName")

ここから先は、遅延バインディングやリフレクションを使用してテストを実行します。

.NET: 同じ DLL の 2 つのバージョンをロードする

于 2010-03-03T00:06:45.937 に答える
1

Jonathan Allen の優れたアドバイスとは別に、問題を解決するためのより「古典的な」方法は、2 つのバージョンを 2 つの異なる AppDomanis にロードすることです。その後、.NET Remoting を使用して、2 つの AppDomains を通信させることができます。したがって、ZA は新しい AppDomain を作成し、この AppDomain ZB にロードし、Remoting を介して ZB で何らかの操作を呼び出す必要があります。

.NET Remoting には、使用するクラス (MarshalByRef からの継承) に関するいくつかの要件があり、AppDomain の作成はコストのかかる操作であることに注意してください。

この助けを願っています

于 2009-07-27T17:24:20.270 に答える
0

同じアセンブリの 2 つのバージョンを同時にロードしました。あなたが説明したとおりのシナリオで起こりました。

ZA と ZB の両方に同じバージョンの ZC をロードするようにランタイムを説得する必要があります。私はそれを行う2つの方法を見つけました:

  1. bindingRedirectApp.config ファイルで要素を使用します。この質問にはいくつかの詳細があります。
  2. AppDomain.AssemblyResolveイベントをご利用ください。この回答にはいくつかの詳細があります。

唯一の問題AppDomain.AssemblyResolveは、ランタイムが要求されたバージョンを見つけられない場合にのみトリガーされることです。両方のバージョンが利用可能な場合は、bindingRedirect. このイベントを使用AppDomain.AssemblyResolveしてから、アセンブリの参照アセンブリ コレクションを調べて、正しいバージョンが読み込まれたことを確認する安全チェックを追加しました。そうでない場合は、古いバージョンのライブラリが転がっているとユーザーに訴え、その場所を伝えます。

于 2010-03-02T23:48:51.610 に答える