12

我编写了以下扩展方法来连接 Windows 运行时应用程序中的两个 IBuffer 对象:

public static IBuffer Concat(this IBuffer buffer1, IBuffer buffer2)
{
    var capacity = (int) (buffer1.Length + buffer2.Length);
    var result = WindowsRuntimeBuffer.Create(capacity);
    buffer1.CopyTo(result);
    buffer2.CopyTo(0, result, buffer1.Length, buffer2.Length);
    return result;
}

这是处理这个问题的最有效方法吗?有没有更好或更简单的方法?

我已经回顾了在 C# 中组合两个或多个字节数组的最佳方法,但我认为我不应该在字节数组之间进行转换。

4

1 回答 1

3

根据 MSDN:

实现IBuffer接口时,必须实现IBufferByteAccess接口,这是一个直接访问缓冲区的COM接口。C++ 调用者使用此接口来避免制作缓冲区的副本。

IBufferByteAccess有以下方法:

HRESULT Buffer(
  [out]  byte **value
);

如果你用 C++ 编写,你可以使用这个接口来促进有效地实现数据复制。但是,class System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions您在方法中使用的 也是在本机代码中实现的,因此它几乎可以肯定地利用IBufferByteAccess接口。从托管代码调用方法WindowsRuntimeBufferExtensions.CopyTo应该与在本机代码中实现其等效方法并调用该实现一样快(除非自定义实现会做较少的验证)。

于 2012-12-19T02:04:15.153 回答