2012-06-08 8 views
6

Mamy komponent WinRT z logiką biznesową, która wewnętrznie masuje bufor C++ unsigned char. Teraz chcemy przekazać ten bufor z C# byte[]. Jak wyglądałaby idealna granica, czyli: , tj., czym byłaby sygnatura funkcji SomeWinRTFunction?Jak najlepiej uzyskać tablicę bajtów od C# do komponentu WinRT w C++

void SomeWinRTFunction(something containing bytes from managed land) 
{ 
    IVector<unsigned char> something using the bytes given from managed land; 
} 

Ten rodzaj problemu wydaje się zbyt nowy nadal dla wyszukiwarek, aby znaleźć to ...

Odpowiedz

7

W części C++ metoda powinna akceptować tablicę platformy o wartości uint8 (odpowiednik bajta C#).

public ref class Class1 sealed 
{ 
public: 
    Class1(); 
    //readonly array 
    void TestArray(const Platform::Array<uint8>^ intArray) 
    { 

    } 
    //writeonly array 
    void TestOutArray(Platform::WriteOnlyArray<uint8>^ intOutArray) 
    { 

    } 

}; 

W C# części przechodzą szereg bajtów:

protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     Byte[] b = new Byte[2]; 
     b[0] = 1; 
     var c = new Class1(); 
     c.TestArray(b); 
     c.TestOutArray(b); 

    } 
+0

Według http://msdn.microsoft.com/en-us/library/windows/apps/hh755822(v=vs. 110) .aspx * "C++/CX również definiuje uint8, co jest równoważne z unsigned char, które nie jest obsługiwane w środowisku wykonawczym Windows i nie może być używane w publicznych interfejsach API" * - więc domyślam się, że "uchar" będzie bardziej "poprawny"? –

+0

To prawda, ale ponieważ ten interfejs API będzie używany przez inne języki, potrzebujesz obsługiwanego typu jako części publicznego interfejsu API (UInt8). Drugi punkt, który próbowałem uczynić, że tablice są rzeczywiście obsługiwane, więc nie ma potrzeby korzystania z ogólnych kolekcji, chyba że chcesz. –

+0

Nie rozumiem tego: * "... ponieważ ten interfejs API zostanie wykorzystany w innym języku (językach), potrzebujesz obsługiwanego typu jako części publicznego interfejsu API (UInt8) ..." * - podany link mówi: uint8' ** nie może ** być używany w publicznych interfejsach API i mówisz, że * jest * obsługiwany w publicznym interfejsie API. –

2

W WinRT IVector jest rzutowany jako IList, nie jestem pewien o bajt -> unsigned char, ale podejrzewam, też jest.

C#

byte[] array; 
SomeWinRTFunction(array); 

C++

void SomeWinRTFunction(IVector<unsigned char> bytes) 
{ 
    IVector<unsigned char> something using the bytes given from managed land; 
} 

Ten whitepaper może rzucić nieco więcej światła.

Powiązane problemy