2012-11-03 17 views
12

私はWindowsランタイムアプリケーションで2つのIBufferオブジェクトを連結するために、次の拡張メソッドを書いている:2つのWindowsランタイムバッファを連結する最良の方法は何ですか?

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; 
} 

が、これはこれを処理する最も効率的な方法ですか?より良い方法や簡単な方法がありますか?

私はBest way to combine two or more byte arrays in C#を見直しましたが、バイト配列との間で変換する必要はないと思います。 MSDNによると

+1

これは完全ではないことがわかりました: '' 'result.Length = capacity;' ' –

答えて

3

:あなたはIBufferインターフェイスを実装する場合

、あなたは直接バッファにアクセスするためのCOMインターフェイスであるIBufferByteAccessインタフェースを実装する必要があります。 C++の呼び出し元は、このインタフェースを使用してバッファのコピーを作成しません。

IBufferByteAccess次のような方法があります:あなたはC++で記述する場合、あなたが効率的にデータのコピーを実装容易にするために、このインターフェイスを使用することができ

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

を。ただし、あなたのメソッドで使用したclass System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensionsもネイティブコードで実装されているため、ほぼ確実にIBufferByteAccessインターフェイスを利用しています。マネージコードからのWindowsRuntimeBufferExtensions.CopyToメソッドの呼び出しは、ネイティブコードで同等の機能を実装し、その実装を呼び出すのと同じくらい速くなければなりません(カスタマイズされた実装では検証が少ない場合を除きます)。

+0

WinRTの実装面に関連する同様の質問の調査に興味がある人は、 http://stackoverflow.com/a/13240181/118478をご覧ください。 –

+0

しかし、最終的にバッファはまだバイト配列ですか?それともストリームのようなものですか?これは、スタックに置かれた値型か、管理する必要があるヒープオブジェクトですか?ドキュメントはこの領域では深刻です! –

+1

ここに私の推測があります:潜在的に大きいサイズのため、スタックに格納される可能性は非常に低いです。データをバイトの配列として格納する必要があります。それ以外の場合は、 'IBufferByteAccess :: Buffer'メソッドから返されたポインタは使用できなくなります。基礎となる実装は管理されていないため、マネージヒープの外側に配置されている可能性があります。ただし、次のリンクから、管理されたヒープに格納されているように見えます(ネイティブコードで使用されている場合は固定されています):http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=72fd199b-f191-46ca -9617-66c71954af41 –

関連する問題