アセンブリを動的に読み込みプラグインとして使う実装に関するメモ。
プラグインの実現方法
- プラグインの機能を実現するクラスの基底クラスをアプリケーションのコア・アセンブリに記述しておく。
- プラグイン部分は別のアセンブリとして構成する。 プラグインの機能は上記のアセンブリに含まれるクラスを継承する。
- アプリケーションの実行時に、プラグインが含まれそうなアセンブリを読み込む。(Assembly.LoadFromメソッド)
- 読み込まれたアセンブリから、上記基底クラスを継承しているクラスを探し出し(Type.IsSubclassOfメソッド)、それを起動する。
プラグインの実現方法・修正版
上記の修正版です。 プラグインがありそうなアセンブリを洗いざらい探索するのは無駄なので、プラグインを含むアセンブリには属性をつけるようにし、検索時にはその属性がアセンブリに対して適用されているかを調べるようにします。
こうすることで、プラグインがないかもしれないアセンブリを探す無駄が省けます。
- プラグインの機能を実現するクラスの基底クラスをアプリケーションのコア・アセンブリに記述しておく。
- プラグイン部分は別のアセンブリとして構成する。 プラグインの機能は上記のアセンブリに含まれるクラスを継承する。 また、アセンブリにはプラグインを含むことを表すカスタム属性を付加しておく。
- アプリケーションの実行時に、プラグインが含まれそうなアセンブリを読み込む。(Assembly.LoadFromメソッド)
- 読み込まれたアセンブリに、上記のカスタム属性が適用されているかをチェックする。
- プラグインが含まれていることを表す属性が適用されたアセンブリから、上記基底クラスを継承しているクラスを探し出し(Type.IsSubclassOfメソッド)、それを起動する。