C# 连接两个Windows运行时缓冲区的最佳方法是什么?

C# 连接两个Windows运行时缓冲区的最佳方法是什么?,c#,windows-runtime,C#,Windows Runtime,我编写了以下扩展方法来在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(res

我编写了以下扩展方法来在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;
}
这是最有效的处理方法吗?有更好或更简单的方法吗

我已经看过了,但我认为我不应该在字节数组之间进行转换。

根据MSDN:

实现接口时,必须实现接口,接口是用于直接访问缓冲区的COM接口。C++调用方使用此接口避免复制缓冲区。
IBufferByteAccess
具有以下方法:

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

如果你用C++编写,你可以使用这个接口来有效地实现数据复制。然而,您在方法中使用的,也是在本机代码中实现的,因此它几乎肯定地利用了

IBufferByteAccess
接口。从托管代码中调用方法
WindowsRuntimeBufferExtensions.CopyTo
应该与在本机代码中实现其等价物并调用该实现一样快(除非自定义实现的验证更少)。

对于那些有兴趣调查类似问题(与WinRT的实现方面相关)的人,也许值得一看。好吧,但最终缓冲区还是字节数组?还是更像一条小溪?它是位于堆栈上的值类型,还是必须管理的堆对象?医生们在这方面做得太差了!以下是我对这个问题的猜测:它不太可能存储在堆栈上(因为它可能很大)。它必须将数据存储为字节数组,否则从
IBufferByteAccess::Buffer
方法返回的指针将不可用。它可能位于托管堆之外,因为底层实现不是托管的。但是,从下面的链接来看,它似乎存储在托管堆上(在本机代码中使用时固定):注意:此接口的实现可能会有所不同(在未来的WinRT版本中,或者如果第三方代码实现了它),因此依赖其底层结构可能是危险的。该链接提供了一些有用的信息。对于如此低级别的公共界面缺乏良好的信息,我仍然感到震惊和沮丧。我在被迫转换为新的Windows.System.Cryptography机制时遇到了它。很多事情都需要一个IBuffer,而你对如何处理事情一无所知。如果你想要赏金,看看你是否能在文档或MS博客中找到关于Windows运行时缓冲区的更正式的东西,或者其他更详细的东西。谢谢。我发现这不完整,缺少:
result.Length=capacity