クロスプラットフォームのインプロセス動的ライブラリバインディング(つまり、軽量で高性能なCOMまたはCORBA)のCラッパーの推奨事項[終了]

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

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

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

>相対パスからライブラリをロード
>特定のdll / .soの構成/名前へのマッピングを提供する
>何らかの初期化を行い、ライブラリを照会して、必要な機能を提供するようにします

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

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

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

Cross-platform alternative to COM-これは近いですが、インプロセスのみが必要です。アウトプロセスの必要はなく、ニーズは少し「軽い」です。

C++ Cross Platform Dynamic Libraries; Linux and Windows

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

編集-見つけたもの

Pocoはニーズに最適であることがわかりました。おまけとして、This pageはC開発の状態と言語の方向についての非常に高く評価されたコメントです…

Pocoが提供する必要があるのは、シンプルなクロスプラットフォームラッピングでした。本当に大したことはありませんが、それでも時間とテストを節約できます。実行時に追加のオーバーヘッドはありません。

ベストアンサー
ACEライブラリには、クロスプラットフォームで動作する動的ライブラリロード用のラッパーが含まれています。
単純なloadlibraryよりも快適にしたい場合は、TAO The ACE ORBをご覧ください。 TAOでcorbaを使用すると、パフォーマンスが非常に高くなります。特にプロセスコールで使用する場合、TAOが最適化するため、ほとんどの場合、自作のプラグインインフラストラクチャに勝ります。

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

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

そのためのコードは次のようになります。

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();

Hereは、TAOが2つのタイプのコロケーション最適化(thru_poaおよびdirect)を知っていることを説明しています。

When using the direct strategy, method invocations on collocated objects become direct calls to servant without checking POA’s status.

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

転載記事の出典を記入してください: クロスプラットフォームのインプロセス動的ライブラリバインディング(つまり、軽量で高性能なCOMまたはCORBA)のCラッパーの推奨事項[終了] - コードログ