2

プラグイン タイプのアーキテクチャを実装するコードを書いています。IThingプラグイン用のインターフェースを名前空間で呼び出しましょうMyStuff。また、プラグインのインスタンスを DLL から動的に作成するコードも用意しました。私のコードは、エクスポーズ クラス、フィールド、およびメソッドを調べ、最終的に見つかったものをテストすることでこれを行います。

if (typeof(IThing).IsAssignableFrom(instType))

これはすべて問題なく、インターフェイスが自分のコードで何かによって実装されている場合、つまり、MyStuff.IThing定義を提供するアセンブリを参照している場合は正常に機能します。

別の国にある別の会社の別の開発者が、プラグ可能なコンポーネントを作成しています。

インターフェイス定義、つまり C# ソースをMyStuff.IThing開発者に送信すると、開発者はそれをコードに含めました。

私たちが最初に見た問題は、彼のコンポーネントが実装されていたとしても、上記のテストMyStuff.IThingに失敗するということです。IsAssignableFrom失敗の理由は、同じ名前空間を持ち、インターフェイス定義が変更されていないにもかかわらず、(当然のことながら) 別のアセンブリにインターフェイス定義があるためと思われます。ここでの解決策は非常に簡単です。つまり、インターフェイスを含むアセンブリ DLL を彼に送ります。

私の質問は次のとおりです。名前空間が一致し、インターフェイス定義が同一であるとすれば、それがどのアセンブリにあるかが問題になるのはなぜですか? アセンブリ Aにアセンブリ BMyStuff.IThingとまったく同じインターフェイス定義が含まれている場合MyStuff.IThing、これらのアセンブリは、のインスタンスを操作するアプリケーションの目的で交換できないのはなぜMyStuff.IThingですか?

4

2 に答える 2

3

名前空間が一致し、インターフェイス定義が同一であるとすれば、それがどのアセンブリにあるかが問題になるのはなぜでしょうか?

これらのインターフェイスを同等のものとして扱うことを選択すると、インターフェイスの比較が難しくなります。固定された一連の項目 (つまり、修飾名とアセンブリ) を比較するのではなく、CLR は修飾名と、すべてのプロパティとすべてのリストを比較する必要があります。メソッドと、再帰的な引数の型。struct特に一貫して実行し、クラスとs を同様の比較スキームに含めたい場合は、そうすると法外に遅くなります。

注: 別の国の開発者と DLL を共有する場合は、アセンブリに厳密な名前が付けられていることを確認してください。これにより、両方が同じアセンブリにリンクし、不一致を早期に検出できるようになります。たとえば、インターフェイスを変更しても、別の開発者が古い DLL でコンパイルされたプラグインを送ってきた場合、プラグインはロードに失敗します。

于 2013-06-18T10:25:31.750 に答える