ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

[C#] プラグインを追加できるようにするための設計を考える

ふと、C#で作ったアプリケーションに、後からプラグインを追加できるようにするにはどうしたらいいのかと思い、検索してみました。

やはりAssemblyクラスを使用した方法でしたね。
Assembly嫌いなんですよ難しいから。

幸い、検索したページに丁寧に
Assemblyからインスタンスを作成する方法が書いてあったので、なんとかやれそうです。

しかし、そのページではプラグインをロードする部分の汎用化がなされていなかったため、
プラグインをロードする処理を汎用化して、.dllで独立させる方法を考えてみました。



こういうのはパソコンに向かうより、紙とペンで考えたほうがいいんですよね。

直感的に図を描くことができます。

というわけで、紙にプログラムの設計図を描いて、
パソコン用に整形したものをお見せします。

UML図じゃないです。UMLって複雑です…。

じゃん!


プラグインのロードを汎用的に行うDLL
プラグインのロードを汎用的に行うDLL


図形が各アセンブリで、その関係を矢印に書いてあります。

かなりDLLが多いですが、
「汎用性のあるプラグインホストクラス」とあるアセンブリが汎用化されています。

つまり、色んなソフトから参照できるってことですね。

さて、注目すべきポイントは、ジェネリックスが用いられている点です。

動的型の機能ですね。C#なのに。

ジェネリックスを使わないと、アプリケーションのほうでバインディングする羽目になりますが
ジェネリックスを使うとバインディングまでDLLにやらせることができます。

DLLで可能な事はできる限りDLLでやるのがいいですからね。


こう整理すると簡単に理解できますし、コーディングも簡単にできます。

しかし、このインターフェースの部分が厄介者でして、
プラグインからアプリケーションの値を取得したいときに
動的じゃいかんから静的にしてでもそしたら値の受け渡しができなくなって仕方ないから一つ一つDLLがパースすることになると、かなりの労力になるし、安全性を損なうからわ~~!
まぁ、これは独り言です。


とにかく、みなさんも複雑なことを考えるさいは、図にしてみてください。
できればUMLで。

tag:

コメント

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/214-1faf8c00
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。