2012-06-08 13 views
6

Abbiamo un componente WinRT con logica aziendale che massaggia internamente un buffer C++ unsigned char. Ora vogliamo alimentare quel buffer da un C# byte[]. Come sarebbe il contorno perfetto, , ovvero, quale sarebbe la firma della funzione SomeWinRTFunction sotto?Come ottenere un array di byte da C# a un componente WinRT C++

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

Questo tipo di problema sembra troppo nuovo ancora per i motori di ricerca per trovare lo ...

risposta

7

Nella parte C++, il metodo deve accettare un array di piattaforma di uint8 (l'equivalente del byte 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) 
    { 

    } 

}; 

Nella parte C# passaggio di byte:

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

Secondo http://msdn.microsoft.com/en-us/library/windows/apps/hh755822(v=vs. 110) .aspx * "C++/CX definisce anche uint8, equivalente al char unsigned, che non è supportato in Windows Runtime e non può essere utilizzato nelle API pubbliche" * - quindi suppongo che 'uchar' sia più" corretto "? –

+0

Vero, ma poiché questa API verrà utilizzata da altre lingue, è necessario un tipo supportato come parte dell'API pubblica (UInt8). L'altro punto che stavo cercando di fare in modo che gli array siano effettivamente supportati, quindi non c'è bisogno di usare collezioni generiche a meno che non lo si voglia. –

+0

Non capisco questo: * "... poiché questa API sarà utilizzata da altre lingue, è necessario un tipo supportato come parte dell'API pubblica (UInt8) ..." * - il link fornito dice ' uint8' ** non può ** essere utilizzato nelle API pubbliche e tu dici che * è * supportato in un'API pubblica. –

2

In WinRT IVector si proietta come IList, io non sono sicuro di byte -> unsigned char, ma ho il sospetto è anche.

C#

byte[] array; 
SomeWinRTFunction(array); 

C++

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

Questo whitepaper potrebbe fare un po 'più di luce.

Problemi correlati