كيفية القيام بما يلي: تحميل موارد غير مدارة في صفيف بايت(Byte)

يناقش هذا الموضوع العديد من الطرق لتحميل الموارد غير المدارة إلى صفيف Byte .

مثال

إذا كنت تعرف حجم المورد غير المُدار يمكنك تعيين صفيف CLR مسبقاً ثم تحميل المورد إلى الصفيف باستخدام مؤشر إلى كتلة الصفيف الخاصة بصفيف 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();
}

0123456789 

يُظهر هذا النموذج كيفية نسخ البيانات من كتلة الذاكرة غير المدارة إلى صفيف مدار.

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

راجع أيضًا:

المرجع

استخدام PInvoke) C++ Interop الضمني )