2009-04-30 27 views
0

予備:呼び出し元は、「プラグイン」アーキテクチャのタイプを公開するネイティブEXEです。 DLLをロードするように設計されています(名前で、コマンドライン引数として指定されています)。そのDLLはネイティブで、特定の関数シグネチャをエクスポートする必要があります。 EXEはC++で、EXEがブラックボックス(変更/再コンパイルできないため)であまり重要ではありません。ネイティブDLLは、前記DLLにおいてネイティブにソリューションを完全に実装することによって、アプリケーションのニーズを満たすことができる。ただし、C#でコード化するためには、実際の作業(ネイティブDLLをシンラッパー/ゲートウェイに変換する)を許可する必要があります。これは、(より存在する場合、共有してください)3つのオプションに私をリード:管理されていない管理オプション:パフォーマンスに関する考慮事項

  1. ネイティブDLLが内部
  2. ネイティブDLLは、C#のCOMオブジェクトと対話するC#クラスライブラリを使用するC++/CLIのDLLをロードしますCCW経由
  3. ネイティブDLLは、C#アセンブリへの呼び出しをCLRをホストとなり

もう一つの要件は、ネイティブのDLLをC#のメッセージ(通話機能)を送信するための方法を必要としますが、C#のニーズだけでなく、ということです特別な事態が発生したときにネイティブDLLへのイベント/コールバックを起動できるようにする(oシャットダウンして戻ってくる)。今この最後のことは、私は第3のオプションで対処する方法がわかりませんが、それはまったく別の質問です。

したがって、ポイント:パフォーマンス。これらのアプローチに関する情報(すべてが要件を満たしていると仮定)私の調査から、私の理解は2が1より多くのオーバーヘッドを持つことになりますが、私は100%自信を持っていないので、私はここにいるのです。 3については、まだ情報がありません。だから、

誰がこれらに対処(または別のエレガントなオプションを知っている)している場合、チャイムください。

感謝を!

+0

パフォーマンスについてはわかりませんが、1が間違いなく最も簡単です。パフォーマンスの影響はおそらく、マーシャリングする必要のあるデータ量に依存します。 EXE <--> DLLから移動する必要のあるデータ量に関する情報はありますか? – Steven

+0

通信は、主にNativeからManagedに頻繁に小さなパケット(256バイト+または - )の形で行われます。 ManagedからNativeへの通信はまれで、非常に短いパケットで行われます。 –

答えて

0

私はこれまでに選択肢1を妥当な成果で達成しました。パフォーマンスに大きな影響を与えることは覚えていませんが、アプリケーションのパフォーマンスが著しく低下することはありませんでした。パフォーマンスの問題が発生した場合、ネイティブから管理された移行が頻繁に発生する可能性が高いと思われます。それらをC++/CLIレイヤーでバッチすることは可能でしょうか?

関連する問題