2011-01-02 7 views
1

私は、コールバック関数を公開するアンマネージドAPIを使って作業しています。この関数は、IntPtrとバイト配列を表す整数を受け取ります。 APIは私にそれをデータで埋めることを期待しています。IntPtr +サイズからマネージバイト配列を作成することはできますか?

管理しているbyte[]を使用して、そのバッファを埋めることができます。私は今のところそれをやってきた方法は、このようなものです:

public void MyCallback(IntPtr rawBufferPtr, int rawBufferLength) 
{ 
    var buffer = new byte[rawBufferLength]; 

    <fill the buffer with whatever data I want> 

    Marshal.Copy(buffer, 0, rawBufferPtr, rawBufferLength); 
} 

それはMarshal.Copyを避け、何とかrawBufferPtrで直接データを保存するためにbyte[]を割り当てることは可能ですか?

ブロックコピーを避けるための他のオプションはありますか?基本的に唯一の代替手段はbyte*ですか?

+0

あなたが明示的に危険なコードを書くことになります。明らかに、バイト*を使用してください。 –

答えて

4

Marshal.WriteXXXファミリの関数を使用して、アンマネージバッファに直接書き込むことができます。

例:あなたがこれを行うとき

Marshal.WriteByte(rawBufferPtr, <offset into buffer>, byteValue); 
2

byte *は、Marshal.Copyへの呼び出しを避けたい場合は、本質的に唯一の方法です。特定のアンマネージドアドレスにバイト配列を割り当てるようにランタイムに指示する方法はありません。コピーを避けたい場合は、安全でないコードを使用する必要があります。