プラグイン タイプのアーキテクチャを実装するコードを書いています。IThing
プラグイン用のインターフェースを名前空間で呼び出しましょうMyStuff
。また、プラグインのインスタンスを DLL から動的に作成するコードも用意しました。私のコードは、エクスポーズ クラス、フィールド、およびメソッドを調べ、最終的に見つかったものをテストすることでこれを行います。
if (typeof(IThing).IsAssignableFrom(instType))
これはすべて問題なく、インターフェイスが自分のコードで何かによって実装されている場合、つまり、MyStuff.IThing
定義を提供するアセンブリを参照している場合は正常に機能します。
別の国にある別の会社の別の開発者が、プラグ可能なコンポーネントを作成しています。
インターフェイス定義、つまり C# ソースをMyStuff.IThing
開発者に送信すると、開発者はそれをコードに含めました。
私たちが最初に見た問題は、彼のコンポーネントが実装されていたとしても、上記のテストMyStuff.IThing
に失敗するということです。IsAssignableFrom
失敗の理由は、同じ名前空間を持ち、インターフェイス定義が変更されていないにもかかわらず、(当然のことながら) 別のアセンブリにインターフェイス定義があるためと思われます。ここでの解決策は非常に簡単です。つまり、インターフェイスを含むアセンブリ DLL を彼に送ります。
私の質問は次のとおりです。名前空間が一致し、インターフェイス定義が同一であるとすれば、それがどのアセンブリにあるかが問題になるのはなぜですか? アセンブリ Aにアセンブリ BMyStuff.IThing
とまったく同じインターフェイス定義が含まれている場合MyStuff.IThing
、これらのアセンブリは、のインスタンスを操作するアプリケーションの目的で交換できないのはなぜMyStuff.IThing
ですか?