他の人が述べたように、コピーせずにマネージド にデータを保存する方法はありませんbyte[]
(提供した現在の構造*)。ただし、実際にマネージ バッファーに格納する必要がない場合は、操作を使用unsafe
して、アンマネージ メモリを直接操作できます。それは本当にあなたがそれをどうする必要があるかによって異なります。
すべてbyte[]
の参照型とその他の参照型は CLR ガベージ コレクターによって管理され、使用されなくなったときにメモリの割り当てと解放を行うのはこれです。の戻り値が指すメモリGetBuffer
は、C++ コードによって割り当てられたアンマネージド メモリのブロックであり、(メモリ レイアウト/実装の詳細は別として) GC マネージド メモリとは本質的に完全に分離されています。したがって、GC マネージド CLR 型 ( byte[]
) を使用して、 が指すアンマネージド メモリ内に現在保持されているすべてのデータを含める場合はIntPtr
、GC が認識しているメモリにデータを移動 (コピー) する必要があります。これは、コードや pinvoke などMarshal.Copy
を使用したカスタム メソッドによって、またはカスタム メソッドによって行うことができます。unsafe
ただし、それをどうしたいかによって異なります。あなたはそれがビデオデータだと言いました。データに何らかの変換またはフィルターを適用する場合は、おそらくアンマネージ バッファーで直接行うことができます。バッファーをディスクに保存したい場合は、おそらくアンマネージ バッファーで直接行うことができます。
長さについては、アンマネージ メモリ バッファーの長さを知る方法はありません。ただし、バッファーを割り当てた関数が長さを教えてくれる場合を除きます。コメンターが言及したように、これは多くの方法で行うことができます(構造の最初のフィールド、メソッドのパラメーター)。
*最後に、C++ コードを制御できる場合は、データを書き込むバッファの割り当てを行わず、代わりに事前に割り当てられたバッファへのポインタを提供するように変更できる可能性があります。その後、C# コードで必要なサイズに事前に割り当てられたマネージ を C# で作成し、型を使用してそれを固定し、C++ コードへのポインターを提供できます。byte[]
GCHandle