2012-06-08 10 views
6

Tenemos un componente WinRT con lógica de negocios que internamente masajes un buffer de C++ unsigned char. Ahora queremos alimentar ese buffer desde un C# byte[]. ¿Cómo sería el límite perfecto, , es decir,, cuál sería la firma de la función SomeWinRTFunction a continuación?Cómo obtener una matriz de bytes de C# a un componente WinRT de C++

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

Este tipo de problema parece demasiado nuevo todavía para los motores de búsqueda para encontrar que ...

Respuesta

7

En la parte de C++, el método debe aceptar una matriz de plataforma de uint8 (el equivalente de C# byte).

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

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

    } 

}; 

En el C# parte pasar la matriz 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

Según http://msdn.microsoft.com/en-us/library/windows/apps/hh755822(v=vs. 110) .aspx * "C++/CX también define uint8, equivalente a char sin signo, que no es compatible con Windows Runtime y no se puede usar en API públicas" * - ¿entonces supongo que 'uchar' sería más" correcto "? –

+0

Es cierto, pero dado que esta API será consumida por otros idiomas, necesita un tipo compatible como parte de la API pública (UInt8). El otro punto que estaba tratando de hacer es que las matrices sean compatibles, por lo que no es necesario usar colecciones genéricas a menos que lo desee. –

+0

No entiendo esto: * "... ya que esta API será consumida por otro (s) idioma (s) necesita un tipo compatible como parte de la API pública (UInt8) ..." * - el enlace provisto dice ' uint8' ** no se puede ** utilizar en API públicas y dices que * es * admitido en una API pública. –

2

En WinRT IVector se proyecta como IList, no estoy seguro acerca de bytes -> unsigned char pero sospecho es demasiado.

C#

byte[] array; 
SomeWinRTFunction(array); 

C++

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

Este whitepaper podría arrojar algo más de luz.

Cuestiones relacionadas