C++ から C# にバイト配列を渡すために使用できるさまざまなアプローチと、そのパフォーマンス特性を知りたいです。理想的には、アンマネージ ヒープ内のバイト配列へのポインターを C# アセンブリに渡し、コピー操作を回避したいと考えています。
2 に答える
Reverse P/Invokeなどを使用してアンマネージ C++ から C# メソッドを呼び出していると仮定すると、ポインターを渡すだけで済みます。C# コードは、ポインタをIntPtr
orとして受け入れる必要UIntPtr
があり、これをアンマネージ配列として扱うことができます。
ポインターを C# コードに渡した後、そのポインターの背後にあるデータにアクセスする方法はいくつかあります。Unsafe Code and Pointersを使用できます。これは、個々のバイトでパーティーをしている場合、おそらく最高のパフォーマンスです。
バイトのストリームとして扱いたい場合は、UnmanagedMemoryStreamを使用できます。
または、Marshal.Copy
and Marshal.Read
(多くのバリアント) メソッドを使用して、そのバッファー内のさまざまな領域でさまざまなデータ型を読み取ることができます。
上記のいずれも、C++ コードと C# コードの間でポインター自体以外のデータをコピーする必要はありません。
C# からメモリにアクセスする方法は他にもありますが、ここには挙げていません。その要点は、どちらの方法でもバイト配列を渡すのはかなり簡単だということです。
C++ 側にポインターを、C# 側に ref を使用できると思います。コメントに記載されているリンクを参照してください。