9

私たちは、アプリの利用者が独自のアルゴリズムを提供できるようにするプラグイン「アーキテクチャ」を備えたアプリケーションを開発しています。(基本的にパーサーのセットがあり、サードパーティが独自のパーサーを提供できるようにします)

ドメインスペースには非常に高いパフォーマンスが必要なため、アウトプロセスバインディングは機能せず、CORBAやCOMなどの重いものはそのままにしておきます。

基本的に、次のような単純なクロスプラットフォームラッパーを探しています。

  • 相対パスからライブラリをロードする
  • 特定のdll/.soのいくつかの構成/名前へのマッピングを提供します
  • 初期化を行い、ライブラリにクエリを実行して、必要な機能が提供されていることを確認します

これは実際にはloadlibrary()とエクスポートされたメソッド呼び出しをラップアラウンドするだけだと思います。これは自分で書くこともできますが、十分な数があるので、既存のコードを使用したいと思います。

繰り返しますが、スループットとパフォーマンスは非常に重要です。

同様の質問は次のとおりです。

COMのクロスプラットフォームの代替手段-これは近いですが、インプロセスのみが必要です-アウトプロセスの必要はなく、私たちのニーズは少し「軽量」です。

C++クロスプラットフォームダイナミックライブラリ; LinuxとWindows

これはアンマネージC++用です-.NETは使用できません

編集-私たちが見つけたもの

Pocoは私たちのニーズに最適であることがわかりました。ボーナスとしてこのページは、C++開発の状態と言語の方向性について非常に高く評価されているコメントです...

Pocoが提供する必要があったのは、単純なクロスプラットフォームラッピングでした。実際にはそれほど多くはありませんが、それでも時間とテストを節約できます。実行時に追加のオーバーヘッドはありません。

4

2 に答える 2

4

ACEライブラリには、クロスプラットフォームで機能するダイナミックライブラリロード用のラッパーが含まれています。プレーンなロードライブラリよりも快適なものが必要な場合は、TAO TheACEORBをご覧ください。TAOでcorbaを使用することは非常にパフォーマンスが高く、TAOが最適化するため、特にプロセス呼び出しで使用する場合は、自作のプラグインインフラストラクチャよりも優れている可能性があります。

ダイナミックライブラリクロスプラットフォームラッパーを使用するには、ACE_DLLを使用します。それはあなたが言及したloadlibrary()の周りの最も基本的なクロスプラットフォームラッパーを提供します。

ACE_DLLの使用とTAOの使用の間に、オブジェクトを動的にロードできるACEのサービス構成フレームワークがあります。ロード後、実装したロード済みオブジェクトへのアップキャストポインターを取得し、ロード済みオブジェクトの任意のメソッドを呼び出すことができます。

これを行うためのコードは次のようになります。

char const * const cpc_myClass = ACE_DYNAMIC_SERVICE_DIRECTIVE(
  "myclass",
  "dllname",
  "_make_MyClass",
  ""
);
result = ACE_Service_Config::process_directive(cpc_myClass);
MyClass * p_obj = ACE_Dynamic_Service<MyClass>::instance ("myclass");
p_obj->callAnyMethodYouLike();

ここでは、TAOが2種類のコロケーション最適化(thru_poaとdirect)を知っていることを説明します。

直接戦略を使用する場合、併置されたオブジェクトに対するメソッド呼び出しは、POAのステータスをチェックせずにサーバントへの直接呼び出しになります。

正しく使用すれば、TAOがどれほど効果的であるかに驚かれるかもしれません。簡単な概念実証を作成し、測定を行うことをお勧めします。

于 2009-12-07T12:53:18.943 に答える
3

これもうまくいくと思います:http: //pocoproject.org/docs/Poco.SharedLibrary.html

于 2009-12-08T16:45:32.477 に答える