2012-01-14 10 views
5

異なるバージョンのアセンブリを読み込む必要があります(既にアプリケーションに同じ名前のアセンブリがあります)。Reflectionを使用して同じアセンブリの異なるバージョン間でクラスオブジェクトを使用

アセンブリを読み込み、リフレクションを使用して呼び出す必要があるメソッドをロードできましたが、クラスオブジェクトを引数として渡してメソッドを呼び出すと、クラスオブジェクトを型に変換できないという例外があります引数のパラメータ。

サンプルコード -

Assembly myAssembly = Assembly.LoadFrom("Assembly Path for assembly with different version"); 
object classObject = myAssembly.CreateInstance("ClassName"); 
Type classType = myAssembly.GetType("ClassName"); 
MethodInfo myMethod = classType.GetMethod("MyMethod", BindingFlags.Instance); 

// Creating an object of class in the latest assembly and need to pass this 
// to method in assembly with different version. 
ClassInBothVesions parameter = new ClassInBothVesions(); 

myMethod.Invoke(classObject, new object[] { parameter }); 

ここパラメータは、私はアセンブリではなく、パラメータのクラスは、現在のバージョンのアセンブリで作成されたので、持っているクラスのオブジェクトです。以前のアセンブリのメソッドに渡そうとすると、変換できないという例外があります。

これをどのように達成できますか?私はここでいくつかの情報を追加する必要がある場合に私に教えてください。前もって感謝します。

+0

私は間違っているかもしれませんが、私が理解する限り、別のバージョンのアセンブリを読み込むには別のアプリケーションドメインが必要です。それ以外の場合は、既にロードされているバージョンが使用されます。 – Vlad

+0

いいえ、同じアプリケーションドメイン内でアセンブリを読み込めました。唯一の問題は、あるバージョンで作成されたパラメータを他のバージョンに渡そうとするときです。私は反射を使用して同じバージョンで作成されたオブジェクトでメソッドを呼び出そうとすると、それは正常に動作します.. –

+0

可能な複製[異なるアセンブリバージョン間でクラスオブジェクトを渡す](http://stackoverflow.com/questions/8871079/passing-class -objects-across-different-assembly-versions) –

答えて

2

MEF(Managed Extensibility Framework)をチェックアウトする必要があります。 AppDomainsやさまざまなアセンブリについて心配する必要がなくなり、簡単にやりたいことをより簡単に行います。

編集:

あなただけあなたが望むものを達成するためにリフレクションを使用したい場合、それはあなたのアプリケーション内で柔軟なオブジェクト・モデルを必要とします。このアプローチの基本は、MEFの種類がボンネットの下で行うことです。あなたが本当にこれを行う権限を得るのは、.Netリモートからのものです。だから私はあなたがそれを読むことを提案します。

あなたが必要なもの:

  • (アセンブリA)でアプリケーション。

  • 古いクラスコード(アセンブリC)を使用したアセンブリ。

  • 2番目のAppDomainに対するプロキシ/リモートとして機能するリモートローダークラス。

  • クラスの古いバージョンのインスタンスを表すプロキシクラス。

  • プロキシクラスとリモートローダーを含むアセンブリB。

ここにあなたが試みることができるものです:

  1. アセンブリAからロードアプリケーション

  2. 新しいAppDomainのインスタンスを作成します。

  3. は、アセンブリB.

    から新しいAppDomainの中であなたの「リモートローダ」クラスのインスタンスをインスタンス化します。これにより、アセンブリBがAppDomainに読み込まれます。

  4. 「リモートローダー」から、アセンブリCを読み込んで古いクラスをインスタンス化し、プロキシクラスのインスタンスを元のAppDomainに戻します。

  5. これで、プロキシと新しいクラスのバージョンの両方が実装できるオブジェクトのより一般的なバージョン(インターフェイスかもしれない)を受け入れるようにメソッドを変更することを願っています。

+0

+1 ..ありがとう、これを調べるだろう。しかし、私のアプリケーションと今すぐ統合することはできない。反射を使って出る方法はありますか? –

+0

私はこれを反射のみの方法で更新しましたが、これは多かれ少なかれ複雑なハックであるため、達成しようとしていることを本当に再考することをお勧めします。 – doogle

関連する問題