今日は、プラグイン側にもっと自由を与えてみたいと思います。
プラグインには、あの大空に翼を広げ飛んで行ってもらいます。(でも見えるところにいてくれないと困るけど)
呼び出すクラスと、呼び出す関数は、アプリケーション側では制御せず、プラグインを作成するタイミングで自由に決めることができます。
使った機能
- カスタム属性
- Activator
- Invoke
構成としては、
- アプリケーション(exe本体)
- プラグイン識別用の属性定義(DLL)
- プラグイン(DLL)
の3部作です。アプリケーションとプラグインは、属性定義(DLL)を参照しています。
では、さっそくサンプルコードです。
アプリケーション(exe)の実装
アプリケーション本体としては、次のような処理をしているだけです。
- 任意のフォルダーからdllを検索
- アセンブリ属性の確認(期待する属性の定義があれば、プラグインとみなす)
- タイプの取得(期待する属性の定義があれば、プラグインクラスとみなす)
- メソッドを呼び出す。
プラグイン用属性定義(DLL)
属性定義では、次の2つのカスタム属性を定義しています。
- アセンブリ用のカスタム属性
- クラス用のカスタム属性
※クラス用のカスタム属性では、呼び出すクラスの順番、クラス内で呼び出す関数の順番を
指定できるようにしています。
プラグイン(DLL)
プラグインでは、アセンブリのカスタム属性と、各クラスで、クラスのカスタム属性を記載しています。
テストのために、属性の定義をしていないクラス(Sample3)も記載しています。
実行結果
実行結果は次のようになり、大成功でした。
Called Sample2
Called SampleA
Called SampleB
通常であれば、
ここまで、プラグインに自由を与えることはないと思います。
動的プラグインを作る際には、程よく使用していただければと思います。
(プラグインかどうかの判断で、アセンブリのカスタム属性くらいなら使うかも)
0 件のコメント:
コメントを投稿