2009-07-27 21 views
6

私はここ数週間でこの問題を解決しようとしてきましたが、まだ良い解決策は見つかりませんでした。うまくいけば私はここで答えを得ることができます。実行時に2つのバージョンのアセンブリをロードする

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

ここでセットアップです:

  • ZAは、ZC(共通)バージョン1.1
  • ZBは、ZCバージョン1.0
に依存

ZAはZBで何かをロードするためのニーズをロードする必要がある(に依存しますが、実行時にZCに依存します)。

ZAはマスターアプリです。 binディレクトリの下には、プラグインディレクトリplugins/plugin-ZBがあり、そこではZBとその依存関係(ZC)をすべて配置したいと考えています。 - うまく働いた

Assembly.Load()をDLLの同じバージョンを使用して:ここで

は、私がこれまで試したものです。

Assembly.Load() dll-ZBのさまざまなバージョンを使用してロードしますが、メソッドが実行されると、例外が見つかりません。

AppDomain.Load()ファイルが見つかりませんでした。私はデリゲートを使ってアセンブリを解決しました。

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

ヘルプ? - TIA

答えて

1

ジョナサンアレンの優れたアドバイスから離れて、問題を解決するためのより古典的な方法は、2つの異なるAppDomanisに2つのバージョンを読み込むことです。 .NET Remotingを使用して2つのAppDomainsをcomunicateにすることができます。したがって、ZAは新しいAppdomainを作成し、このAppDomain ZBにロードし、Remotingを介してZBでいくつかの操作を呼び出す必要があります。

.NET Remotingには、使用するクラス(MarshalByRefからの継承)にいくつかの要件があり、AppDomainの作成は高価な操作です。

希望する

+0

「あなただけのAppDomainのためのアセンブリの一のバージョンを持つことができ、」真実ではありません。 アセンブリの2つのバージョンを1つのアセンブリから参照することもできます。詳しくはexternエイリアスを参照してください。ここではまずGoogleにその機能の例をポップアップ表示します:http://blogs.msdn.com/ b/ansonh/archive/2006/09/28/extern-alias-walkthrough.aspx – Graham

+0

2つのAppDomainsを使用することは、説明した問題の解決策です。 – Graham

+0

あなたは正しく、答えが更新されました! –

0

同じアセンブリの2つのバージョンを同時にロードしました。あなたがそれを記述するのと同じようにシナリオが起こった。

ZAとZBの両方に同じバージョンのZCをロードするようにランタイムに納得させる必要があります。

  1. があなたのApp.configファイルでbindingRedirect要素を使用します。私はそれを行うには、2つの方法を発見しました。 this questionにいくつかの詳細があります。
  2. AppDomain.AssemblyResolveイベントを使用してください。 this answerにいくつかの詳細があります。

AppDomain.AssemblyResolveの唯一の問題は、実行時に要求されたバージョンが見つからない場合にのみ発生することです。両方のバージョンが利用可能な場合は、bindingRedirectを使用する必要があります。私はAppDomain.AssemblyResolveイベントを使用して、適切なバージョンがアセンブリの参照アセンブリコレクションを調べてロードされていることを確認する安全性チェックを追加しました。もしそうでなければ、古いバージョンのライブラリが横たわっていることをユーザに訴え、どこにあるのかを伝えます。

+1

これは2つの異なるバージョンをロードしていません。同じバージョンを2回ロードしています。 –

+1

私がこの問題を抱えていたとき、@Cameronは、ZAが起動したときに実行時にZCのバージョン1.1をロードしました。その後、ZBプラグインをロードすると、実行時にバージョン1.0のZCがロードされました。それは私が2つの異なるバージョンをロードすることによって意味しています。 ZAとZBがZCからオブジェクトにオブジェクトを渡すようにするには、両方のオブジェクトに同じバージョンのZCをロードさせる必要がありました。それは私が私の答えでやる方法を記述していることです。私は元の質問を誤解しましたか? –

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: Load two version of the same DLL

+0

優れたアドバイス!それを知らなかった –

関連する問題