2009-08-13 16 views
0

言語の場合プラグインを実行したり、ユーザーがモジュール/ライブラリ/コードを使用してランタイムコードを拡張する一般的な方法は何ですか?私はC/C++を考えていましたが、他の言語がどのようにこれを行うのかも同様に適用可能です。プラグイン/ランタイム拡張アーキテクチャ

答えて

0

1つの方法は、メインプログラムがdlopen()で開く動的オブジェクトにモジュールをコンパイルすることです。次に、dlsym()を使用して、モジュールが定義しなければならない特定の初期化関数を探し、それを呼び出します。たとえば、foo.soに格納されているモジュールにmodule_foo_init()という関数を定義する必要があるとします。

モジュールのinitルーチンは、通常、メインプログラムが提供する関数を呼び出して、特定のイベントやフックのハンドラを登録します。

0

OSGiは、広く使用されているプラ​​グイン可能なUIを扱うEclipseフレームワークの基礎でもあります。

0

私が働いてきたほとんどの言語でこれを行うための一般的な方法:

  • あなたは2つのバイナリファイル、あなたのメインプログラム、および「プラグイン・インタフェース・ライブラリー」を持っています。
  • プラグインインターフェイスライブラリには、基本的に、インターフェイスクラスまたは抽象ベースクラス、またはプラグインがコード化して拡張できるものだけが含まれています。
  • メインプログラムはリフレクションまたはその他の標準化されたインターフェイスを使用して、すべてのプラグインライブラリからインターフェイスを実装するクラスのインスタンスを抽出します。すべてのプラグインに対してこの手順を繰り返します。
  • プラグインとのやりとりが必要な場合は常に、インターフェイスに対して呼び出しが行われます。

最後の部分を設計するのは、ほとんどの作業が入ってくる場所です。何を呼び出すか、何かを許可する必要がありますか?どのように登録されているのですか、それは単に関数なのでしょうか?それはおそらく空かもしれませんし、何らかの "フック登録"がありますか?後者の場合、どのように動作しますか(私は通常、フックの登録に使用できるオブジェクトをコンストラクタに渡します)。

関連する問題