言語の場合プラグインを実行したり、ユーザーがモジュール/ライブラリ/コードを使用してランタイムコードを拡張する一般的な方法は何ですか?私はC/C++を考えていましたが、他の言語がどのようにこれを行うのかも同様に適用可能です。プラグイン/ランタイム拡張アーキテクチャ
0
A
答えて
0
1つの方法は、メインプログラムがdlopen()
で開く動的オブジェクトにモジュールをコンパイルすることです。次に、dlsym()
を使用して、モジュールが定義しなければならない特定の初期化関数を探し、それを呼び出します。たとえば、foo.so
に格納されているモジュールにmodule_foo_init()
という関数を定義する必要があるとします。
モジュールのinitルーチンは、通常、メインプログラムが提供する関数を呼び出して、特定のイベントやフックのハンドラを登録します。
0
0
私が働いてきたほとんどの言語でこれを行うための一般的な方法:
- あなたは2つのバイナリファイル、あなたのメインプログラム、および「プラグイン・インタフェース・ライブラリー」を持っています。
- プラグインインターフェイスライブラリには、基本的に、インターフェイスクラスまたは抽象ベースクラス、またはプラグインがコード化して拡張できるものだけが含まれています。
- メインプログラムはリフレクションまたはその他の標準化されたインターフェイスを使用して、すべてのプラグインライブラリからインターフェイスを実装するクラスのインスタンスを抽出します。すべてのプラグインに対してこの手順を繰り返します。
- プラグインとのやりとりが必要な場合は常に、インターフェイスに対して呼び出しが行われます。
最後の部分を設計するのは、ほとんどの作業が入ってくる場所です。何を呼び出すか、何かを許可する必要がありますか?どのように登録されているのですか、それは単に関数なのでしょうか?それはおそらく空かもしれませんし、何らかの "フック登録"がありますか?後者の場合、どのように動作しますか(私は通常、フックの登録に使用できるオブジェクトをコンストラクタに渡します)。
関連する問題
- 1. シンプルなルビープラグイン/拡張アーキテクチャ
- 2. 拡張可能(多層)アーキテクチャのWebSocketサーバーアプリケーション
- 3. BlogEngine.net拡張マネージャーのアーキテクチャは何ですか?
- 4. jQueryの(拡張)(拡張中)
- 5. SilverStripeモジュール拡張の拡張
- 6. パフォーマンス:拡張バイナリイメージ(形態学的拡張)
- 7. Typo3 8.7拡張コアフォームの拡張子
- 8. TYPO3用の拡張テーブル拡張
- 9. Chrome拡張機能アイコン://拡張/
- 10. LINQの拡張メソッド - GetYearWeekFormat拡張
- 11. マイシェア拡張子がDropboxの拡張
- 12. クアルコム拡張スナップドラゴンデバイスの拡張現実
- 13. Tcl拡張:拡張のライフサイクルClientData
- 14. 拡張された拡張エラー
- 15. MacでのQt:ファイルシステムライブラリの拡張 - アーキテクチャのシンボルが見つかりませんx86_64
- 16. インタフェースの実装と拡張性に関するアーキテクチャ上の質問
- 17. 拡張
- 18. 拡張
- 19. 拡張オーディオファイルサービス:ExtAudioFileRead
- 20. 拡張クラスローダー
- 21. MVC拡張メソッド
- 22. AIXカーネル拡張
- 23. 拡張ASCIIは
- 24. バイナリイメージの拡張?
- 25. Mercurialの拡張
- 26. Chrome拡張コンテキストメニューポップアップ
- 27. Safari拡張メッセージング
- 28. 拡張のJFrame
- 29. Chrome拡張カスタムカーソル
- 30. バンドルPECL拡張