Dela via


Så här gör du: Marskalkmatriser med C++ Interop

Det här avsnittet visar en aspekt av Visual C++-samverkan. Mer information finns i Använda C++ Interop (Implicit PInvoke).

I följande kodexempel används de hanterade, ohanterade #pragma-direktiven för att implementera hanterade och ohanterade funktioner i samma fil, men dessa funktioner samverkar på samma sätt om de definieras i separata filer. Filer som endast innehåller ohanterade funktioner behöver inte kompileras med /clr (Common Language Runtime Compil).

Exempel: Skicka hanterad matris till ohanterad funktion

I följande exempel visas hur du skickar en hanterad matris till en ohanterad funktion. Den hanterade funktionen använder pin_ptr (C++/CLI) för att förhindra skräpinsamling för matrisen innan den ohanterade funktionen anropas. Genom att tillhandahålla den ohanterade funktionen med en fäst pekare i GC-heapen kan du undvika att göra en kopia av matrisen. För att visa att den ohanterade funktionen har åtkomst till GC-heapminnet ändrar den innehållet i matrisen och ändringarna återspeglas när den hanterade funktionen återupptar kontrollen.

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

Exempel: Skicka ohanterad matris till hanterad funktion

I följande exempel visas hur du skickar en ohanterad matris till en hanterad funktion. Den hanterade funktionen kommer åt matrisminnet direkt (i stället för att skapa en hanterad matris och kopiera matrisinnehållet), vilket gör att ändringar som görs av den hanterade funktionen återspeglas i den ohanterade funktionen när den återfår kontrollen.

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

Se även

Använda C++ Interop (implicit PInvoke)