是否可以从IntPtr +大小创建托管字节数组?

时间:2011-01-02 14:34:36

标签: c# marshalling unmanaged

我正在使用一个暴露回调函数的非托管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 个答案:

答案 0 :(得分:4)

您可以使用Marshal.WriteXXX系列函数直接写入非托管缓冲区。

示例:

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

答案 1 :(得分:3)

如果你想避免调用byte *

Marshal.Copy基本上是唯一的选择。没有办法告诉运行时在特定的非托管地址分配字节数组。如果你想避免复制,你需要使用不安全的代码。