Procedura: caricare risorse non gestite in una matrice di byte

In questo argomento vengono illustrati alcuni modi per caricare risorse non gestite in una matrice Byte.

Esempio

Se si conosce la dimensione della risorsa non gestita, è possibile preallocare una matrice CLR e quindi caricare la risorsa nella matrice utilizzando un puntatore al blocco di matrice della matrice CLR.

// load_unmanaged_resources_into_Byte_array.cpp
// compile with: /clr
using namespace System;
void unmanaged_func( unsigned char * p ) {
   for ( int i = 0; i < 10; i++ )
      p[ i ] = i;
}

public ref class A {
public:
   void func() {
      array<Byte> ^b = gcnew array<Byte>(10);
      pin_ptr<Byte> p =  &b[ 0 ];
      Byte * np = p;
      unmanaged_func( np );   // pass pointer to the block of CLR array.
      for ( int i = 0; i < 10; i++ )
         Console::Write( b[ i ] );
      Console::WriteLine();
   }
};

int main() {
   A^ g = gcnew A;
   g->func();
}
  

In questo esempio viene illustrato come copiare i dati da un blocco di memoria non gestita a una matrice gestita.

// load_unmanaged_resources_into_Byte_array_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

#include <string.h>
int main() {
   char buf[] = "Native String";
   int len = strlen(buf);
   array<Byte> ^byteArray = gcnew array<Byte>(len + 2);
   
   // convert any native pointer to IntPtr by doing C-Style cast
   Marshal::Copy( (IntPtr)buf, byteArray, 0, len );
}

Vedere anche

Riferimenti

Utilizzo delle funzionalità di interoperabilità C++ (PInvoke implicito)