2012-11-03 9 views
12

Pisałem następujące metody rozszerzenie do łączenia dwóch obiektów IBuffer w aplikacji Windows Runtime:Jaki jest najlepszy sposób łączenia dwóch buforów środowiska wykonawczego systemu 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; 
} 

Jest to najbardziej skuteczny sposób, aby sobie z tym poradzić? Czy istnieje lepszy lub łatwiejszy sposób?

Sprawdziłem Best way to combine two or more byte arrays in C#, ale nie sądzę, że powinienem konwertować do i od tablic bajtowych.

+1

Odkryłem, że nie jest to kompletne, brakujące: '' 'result.Length = capacity;' '' –

Odpowiedz

3

Zgodnie z MSDN:

Kiedy implementować interfejs IBuffer, trzeba zaimplementować interfejs IBufferByteAccess, która stanowi interfejs COM dostępu do bufora bezpośrednio. Wywoływacze C++ używają tego interfejsu, aby uniknąć tworzenia kopii bufora.

IBufferByteAccess ma następującą metodę:

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

Jeśli piszesz w C++, można użyć tego interfejsu w celu ułatwienia wdrożenia efektywnego kopiowania danych. Jednak metoda class System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions, która została użyta w Twojej metodzie, jest również zaimplementowana w natywnym kodzie, dzięki czemu niemal w pełni korzysta z interfejsu IBufferByteAccess. Metoda wywołania WindowsRuntimeBufferExtensions.CopyTo z kodu zarządzanego powinna być tak szybka, jak implementacja odpowiednika w kodzie rodzimym i wywołanie tej implementacji (chyba że niestandardowa implementacja spowodowałaby mniejszą walidację).

+0

Dla osób zainteresowanych badaniem podobnych pytań (związanych z aspektami implementacyjnymi WinRT), może być warte zrobienia spójrz na http://stackoverflow.com/a/13240181/118478. –

+0

OK, ale ostatecznie bufor nadal jest tablicą bajtów? Czy może bardziej przypomina strumień? Czy jest to typ wartości umieszczony na stosie lub obiekt sterty, którym należy zarządzać? Dokumenty są fatalne w tej dziedzinie! –

+1

Oto moje przypuszczenia na ten temat: Jest bardzo mało prawdopodobne, że jest przechowywany na stosie (z powodu potencjalnie dużego rozmiaru). Musi przechowywać dane jako tablicę bajtów, w przeciwnym razie wskaźnik zwrócony z metody "IBufferByteAccess :: Buffer" byłby bezużyteczny. Może znajdować się poza sterowaną stertą, ponieważ implementacja podstawowa nie jest zarządzana. Jednak z poniższego linku wygląda na to, że jest on przechowywany na zarządzanej stercie (i przypięty, gdy jest używany w natywnym kodzie): http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=72fd199b-f191-46ca -9617-66c71954af41 –

Powiązane problemy