2016年9月9日金曜日

C#で動的プラグインの作成(InterFace未使用版)

C#で動的プラグインを作るといえば、通常は、インターフェースを作り、インターフェース派生のプラグインを作って呼び出すのが普通だと思います。(そのうち書いてみます)

今日は、プラグイン側にもっと自由を与えてみたいと思います。
プラグインには、あの大空に翼を広げ飛んで行ってもらいます。(でも見えるところにいてくれないと困るけど)

呼び出すクラスと、呼び出す関数は、アプリケーション側では制御せず、プラグインを作成するタイミングで自由に決めることができます。

使った機能
  • カスタム属性
  • Activator
  • Invoke

構成としては、
  • アプリケーション(exe本体)
  • プラグイン識別用の属性定義(DLL)
  • プラグイン(DLL)

の3部作です。アプリケーションとプラグインは、属性定義(DLL)を参照しています。



では、さっそくサンプルコードです。

アプリケーション(exe)の実装

アプリケーション本体としては、次のような処理をしているだけです。
  1. 任意のフォルダーからdllを検索
  2. アセンブリ属性の確認(期待する属性の定義があれば、プラグインとみなす)
  3. タイプの取得(期待する属性の定義があれば、プラグインクラスとみなす)
  4. メソッドを呼び出す。

プラグイン用属性定義(DLL) 

属性定義では、次の2つのカスタム属性を定義しています。
  • アセンブリ用のカスタム属性
  • クラス用のカスタム属性
※クラス用のカスタム属性では、呼び出すクラスの順番、クラス内で呼び出す関数の順番を
指定できるようにしています。



プラグイン(DLL)

プラグインでは、アセンブリのカスタム属性と、各クラスで、クラスのカスタム属性を記載しています。
テストのために、属性の定義をしていないクラス(Sample3)も記載しています。



実行結果

実行結果は次のようになり、大成功でした。


Called Sample2
Called SampleA
Called SampleB


通常であれば、
ここまで、プラグインに自由を与えることはないと思います。
動的プラグインを作る際には、程よく使用していただければと思います。
(プラグインかどうかの判断で、アセンブリのカスタム属性くらいなら使うかも)



0 件のコメント:

コメントを投稿