2009-03-06 15 views
2

シナリオを教えて、誰かが解決策/回避策を持っているかどうかを見てみましょう。VB.NETインターフェイス/レイトバインディング並べ替え

私はクラスだけを含むライブラリ(DLL)を持っています。別のライブラリでは、最初のライブラリのクラスが実装するインターフェイスがあります。クライアントは、常に最新のインタフェースを含むライブラリの1つのバージョンのみを参照し、それらのインタフェース(追加のインタフェース/メソッド)への追加のみが行われます。また、そのインターフェイスライブラリのバージョンは1つしかないので、クライアントは参照を更新する必要はありません(インターフェイスライブラリはリフレクションによってロードされるため、通常のプロービングルールは適用されません。に頼む)。インタフェースを実装するライブラリには、異なるクライアントが同時に参照する複数のバージョンがあります。

クライアントアセンブリが実装ライブラリの古いバージョンを参照しているときに問題が発生します。実装ライブラリのクラス型からオブジェクトを作成し、別のクライアントアセンブリに渡します。そのクライアントアセンブリは、最新の(そして唯一の)バージョンのインタフェースライブラリを使用し、渡されたオブジェクトを適切なインタフェースタイプでキャストしようとします。このキャストは例外 'System.TypeLoadException:アセンブリZのタイプYのメソッドXに実装がありません'で失敗します。私は、インターフェイスの新しいバージョン(同じバージョン番号 - 古いライブラリclobbered)ではメソッドXが定義されているので、この例外は予期されていましたが、渡されるオブジェクトの古いバージョンには対応するインタフェースを実装すると言うメタデータが含まれています。新しいインターフェイスメソッドXでは、そのクラスに実装がないため、マッピングが失敗します。

私の質問はこれです。クライアントにそのインタフェースを使用させる方法はありますか?参照されたオブジェクトが新しいインタフェースの型にキャストされたときに例外が生成されるのではなく、参照されたオブジェクトに実装されていないメソッドが呼び出されたときだけ例外が発生しますか?

私はintellisense /コンパイル時の型チェックが必要なので、レイトバインドはオプションではありません...また、私は関数ポインタとラッパークラスでこれを行う方法を知っています - 私はもっと良い解決策を望んでいましたこれは、通常の.NETタイプと調整されています。

おかげで - すべてのヘルプは非常にあなたが代わりにインタフェースを含むライブラリのインタフェースの抽象(MustInherit)クラスを使用してオーバーライド可能としてメソッドとプロパティを設定することができ

答えて

2

を高く評価しています。この方法では、たとえメソッドが実装されていない例外をスローしたとしても、インターフェイスライブラリ内のすべてのメソッドの実装が常に存在します。 MustOverrideではなくOverridableメソッドを作成すると、TypeLoadExceptionが回避されます。

+0

これは素晴らしいことですが、インターフェイスではありませんが、完全に機能します。バーチャルな方法 - これを考えないために私自身は怒っている。木々から森を見るのを助けてくれてありがとう。 – user74502

+0

助けてくれてうれしいです。私はしばらくの間、実行可能な答えを考えました。問題は興味深いものでした。 – bstoney