3

この質問をして、どうやら人々を困惑させた後、考えてみるとどうですか? C# アプリケーションから C++ dll にバッファーを渡して、C# でタイミング イベントを発生させて、バッファーの内容をコピーすることはできますか? そうすれば、明らかに発生するコールバック呼び出しによる遅延を回避できます。それは機能しますか、またはマーシャリングはそのようなバッファアクセスを防ぎますか? または、安全でないモードに移行する必要がありますか?また、そうしない場合、それを機能させるための魔法の言葉は何ですか?

その他の質問から要約するには:

  • C++ で記述されたドライバーと C# で記述されたアプリがあります。
  • プレビュー スタイルの方法でドライバーからデータを取得する必要があります。
  • C++ アプリケーションは、C++ dll と正常に対話します。C# アプリでは、データのコピーに大きな遅延があります。
  • 遅延は、C# 側のリリース/デバッグの違いによるものではないようです
  • 遅延を回避する必要があります。この提案されたバッファ スキームは機能しますか? C# アプリは、C++ dll によって書き込まれたバッファーから消費できますか? それとも何か他のことをする必要がありますか?
4

4 に答える 4

2

ご希望の方は

  1. マネージ コードでアンマネージ コードからのデータを消費する
    次に、データをバイト ポインター (安全でないコード) として消費するか、コピーを取得しない限り (マーシャリングによって行われます)、問題が発生します。速度を落としているのはおそらく後者です(ただし、ベンチマークを推測しないでください)。

  2. アンマネージ コードでマネージ コードからのデータを消費する
    これは非常に簡単です。アンマネージ コードで使用されている間、関連付けられたバッファを固定する必要があるだけです。

1. 遅延のベンチマークを行いましたか? それがコピーである場合(バッファの大きさは重要ではありません)、C#コードを変更して、バイトポインタ(および長さ)としてバッファとやり取りできますか?
C++/CLI にアクセスできる場合は、コードの一部をアンマネージする (生のバッファーを操作する) 方が簡単で、管理されている部分はそのサブセクションのみを操作する (コピーのみを行う) 方が簡単であるため、これをよりクリーンに回避できることがよくあります。絶対に必要なもの)

于 2009-06-11T17:39:47.560 に答える
1

PInvoke が遅い主な理由と、これを解決するために使用するものについては、SuppressUnmanagedCodeSecurityAttributeを参照してください。

于 2009-06-11T16:57:59.673 に答える
0

はい、C# から C++ にバッファ (byte[] など) を渡すことができます。私はあなたの元の問題に困惑しています。私は自分の C++ コードから C# へのコールバックを使用していますが、マーシャリングのオーバーヘッドが予想されるため、ループの反復ごとにコールバックを実行しないようにしていますが、パフォーマンスの問題に気付いたことはありません。

于 2009-06-11T16:42:00.710 に答える
0

私が他のスレッドで言ったように、遅延は完全に C++ 側にあったようです。

于 2009-09-24T19:08:06.847 に答える