Можно ли создать управляемый байтовый массив из размера IntPtr +? - PullRequest
1 голос
/ 02 января 2011

Я работаю с неуправляемым API, который предоставляет функцию обратного вызова.Эта функция получает IntPtr и целое число, которое описывает байтовый массив.API ожидает, что я заполню его данными.

Я хотел бы использовать управляемый 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 и как-то выделить byte[] для хранения данных непосредственно на rawBufferPtr?

Если нет, то какие еще есть варианты, чтобы избежать копирования блока?byte* является единственной альтернативой?

Ответы [ 2 ]

4 голосов
/ 02 января 2011

Вы можете использовать семейство функций Marshal.WriteXXX для прямой записи в неуправляемый буфер.

Пример:

Marshal.WriteByte(rawBufferPtr, <offset into buffer>, byteValue);
3 голосов
/ 02 января 2011

byte * по сути является единственной альтернативой, если вы хотите избежать звонка на Marshal.Copy. Нет способа указать среде выполнения выделить массив байтов по определенному неуправляемому адресу. Вам нужно будет использовать небезопасный код, если вы хотите избежать копирования.

...