我正在使用一个暴露回调函数的非托管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*
基本上是唯一的选择吗?
答案 0 :(得分:4)
您可以使用Marshal.WriteXXX系列函数直接写入非托管缓冲区。
示例:
Marshal.WriteByte(rawBufferPtr, <offset into buffer>, byteValue);
答案 1 :(得分:3)
byte *
, Marshal.Copy
基本上是唯一的选择。没有办法告诉运行时在特定的非托管地址分配字节数组。如果你想避免复制,你需要使用不安全的代码。