【问题标题】:Is it possible to create a managed byte array from an IntPtr + size?是否可以从 IntPtr + 大小创建托管字节数组?
【发布时间】:2011-01-02 14:34:35
【问题描述】:

我正在使用一个公开回调函数的非托管 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* 本质上是唯一的选择吗?

【问题讨论】:

  • 执行此操作时,您将明确编写不安全的代码。不妨让它显而易见,使用 byte*。

标签: c# marshalling unmanaged


【解决方案1】:

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

例子:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      相关资源
      最近更新 更多