管理されていないC++exeがあり、C#コード内から直接呼び出すことができます(libを作成できるC ++コードがあります)。または、プロセスを生成してOutputStreamからデータを取得します。オプションの長所/短所は何ですか?
5 に答える
C++ 実行可能ファイルの関数のサブセットを取得してライブラリにビルドする方がはるかに優れています。タイプ セーフを維持し、例外処理をより有効に活用できるようになります (ライブラリ内の関数への呼び出しを管理する方法をより細かく制御することは言うまでもありません)。
実行可能ファイルの OutputStream からデータを取得すると、実行可能ファイルのプロセスが見えなくなり、実際の例外処理も行われなくなり、持っていた可能性のある型情報が失われます。
進行中の主な欠点は、管理された/ネイティブの対話を正しく処理することです。
1)
C++ コードはおそらく、クリーンアップ/リソースの解放などの決定論的破壊に依存するでしょう。おそらく、これは C++ で一般的で優れた慣行であるためです。
これは、マネージ コードでは、C++ cli ラッパー コードを適切に破棄するように注意する必要があることを意味します。コードが 1 回使用される場合は、c# の using 句がこれを行います。オブジェクトがメンバーとしてしばらく存続する必要がある場合は、破棄をアプリケーション全体にチェーンする必要があることがわかります。
2)
もう 1 つの問題は、アプリケーションがどの程度メモリを消費しているかによって異なります。マネージド ガベージ コレクタは遅延する可能性があります。管理された割り当てが利用可能なスペースよりも多くのスペースを必要とする場合、それが開始されることが保証されています。ただし、管理されていないアロケーターは接続されていません。したがって、マネージド アロケータに、アンマネージド アロケーションを行うこと、およびそのスペースを利用可能にしておく必要があることを手動で通知する必要があります。これは AddMemoryPressure メソッドを使用して行われます。
プロセス外であることの主な欠点は次のとおりです。
1) 速度。
2) 通信を管理するためのコードのオーバーヘッド。
3) 1 つまたは他のプロセスが予期しないときに終了するのを監視するためのコード オーバーヘッド。
OutputStream をスクレイピングすることの大きな欠点は、データ型の欠如です。いくつかの関数をエクスポートし、既存のライブラリを再利用する作業を行う方がはるかに望ましいです。しかし、それは本当に単なる好みです。