Bagikan melalui


Cara: Array Marshal Menggunakan Interop C++

Topik ini menunjukkan satu faset interoperabilitas Visual C++. Untuk informasi selengkapnya, lihat Menggunakan Interop C++ (PInvoke Implisit).

Contoh kode berikut menggunakan arahan #pragma terkelola dan tidak dikelola untuk mengimplementasikan fungsi terkelola dan tidak terkelola dalam file yang sama, tetapi fungsi-fungsi ini beroperasi dengan cara yang sama jika ditentukan dalam file terpisah. File yang hanya berisi fungsi yang tidak dikelola tidak perlu dikompilasi dengan /clr (Kompilasi Runtime Bahasa Umum).

Contoh: Meneruskan array terkelola ke fungsi yang tidak dikelola

Contoh berikut menunjukkan cara meneruskan array terkelola ke fungsi yang tidak dikelola. Fungsi terkelola menggunakan pin_ptr (C++/CLI) untuk menekan pengumpulan sampah untuk array sebelum memanggil fungsi yang tidak dikelola. Dengan menyediakan fungsi yang tidak dikelola dengan pointer yang disematkan ke dalam tumpukan GC, overhead membuat salinan array dapat dihindari. Untuk menunjukkan bahwa fungsi yang tidak dikelola mengakses memori tumpukan GC, fungsi ini memodifikasi konten array dan perubahan tercermin ketika fungsi terkelola melanjutkan kontrol.

// PassArray1.cpp
// compile with: /clr
#ifndef _CRT_RAND_S
#define _CRT_RAND_S
#endif

#include <iostream>
#include <stdlib.h>
using namespace std;

using namespace System;

#pragma unmanaged

void TakesAnArray(int* a, int c) {
   cout << "(unmanaged) array received:\n";
   for (int i=0; i<c; i++)
      cout << "a[" << i << "] = " << a[i] << "\n";

   unsigned int number;
   errno_t err;

   cout << "(unmanaged) modifying array contents...\n";
   for (int i=0; i<c; i++) {
      err = rand_s( &number );
      if ( err == 0 )
         a[i] = number % 100;
   }
}

#pragma managed

int main() {
   array<int>^ nums = gcnew array<int>(5);

   nums[0] = 0;
   nums[1] = 1;
   nums[2] = 2;
   nums[3] = 3;
   nums[4] = 4;

   Console::WriteLine("(managed) array created:");
   for (int i=0; i<5; i++)
      Console::WriteLine("a[{0}] = {1}", i, nums[i]);

   pin_ptr<int> pp = &nums[0];
   TakesAnArray(pp, 5);

   Console::WriteLine("(managed) contents:");
   for (int i=0; i<5; i++)
      Console::WriteLine("a[{0}] = {1}", i, nums[i]);
}

Contoh: Meneruskan array yang tidak dikelola ke fungsi terkelola

Contoh berikut menunjukkan meneruskan array yang tidak dikelola ke fungsi terkelola. Fungsi terkelola mengakses memori array secara langsung (dibandingkan dengan membuat array terkelola dan menyalin konten array), yang memungkinkan perubahan yang dibuat oleh fungsi terkelola tercermin dalam fungsi yang tidak dikelola saat mendapatkan kembali kontrol.

// PassArray2.cpp
// compile with: /clr
#include <iostream>
using namespace std;

using namespace System;

#pragma managed

void ManagedTakesAnArray(int* a, int c) {
   Console::WriteLine("(managed) array received:");
   for (int i=0; i<c; i++)
      Console::WriteLine("a[{0}] = {1}", i, a[i]);

   cout << "(managed) modifying array contents...\n";
   Random^ r = gcnew Random(DateTime::Now.Second);
   for (int i=0; i<c; i++)
      a[i] = r->Next(100);
}

#pragma unmanaged

void NativeFunc() {
   int nums[5] = { 0, 1, 2, 3, 4 };

   printf_s("(unmanaged) array created:\n");
   for (int i=0; i<5; i++)
      printf_s("a[%d] = %d\n", i, nums[i]);

   ManagedTakesAnArray(nums, 5);

   printf_s("(ummanaged) contents:\n");
   for (int i=0; i<5; i++)
      printf_s("a[%d] = %d\n", i, nums[i]);
}

#pragma managed

int main() {
   NativeFunc();
}

Lihat juga

Menggunakan interop C++ (PInvoke implisit)