Gewusst wie: Laden von nicht verwalteten Ressourcen in ein Byte-Array

In diesem Thema werden verschiedene Möglichkeiten zum Laden nicht verwalteter Ressourcen in ein Byte Array erläutert.

Beispiele

Wenn Sie die Größe Ihrer nicht verwalteten Ressource kennen, können Sie ein CLR-Array vorab allocatieren und dann die Ressource mithilfe eines Zeigers auf den Arrayblock des CLR-Arrays in das Array laden.

// 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();
}
0123456789

In diesem Beispiel wird gezeigt, wie Daten aus einem nicht verwalteten Speicherblock in ein verwaltetes Array kopiert werden.

// 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 );
}

Siehe auch

Verwenden von C++-Interop (implizites PInvoke)