Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp ziet u één facet van visual C++-interoperabiliteit. Zie C++ Interop (impliciete PInvoke) gebruiken voor meer informatie.
In de volgende codevoorbeelden worden de beheerde, onbeheerde #pragma instructies gebruikt om beheerde en onbeheerde functies in hetzelfde bestand te implementeren, maar deze functies werken op dezelfde manier als deze zijn gedefinieerd in afzonderlijke bestanden. Bestanden met alleen niet-beheerde functies hoeven niet te worden gecompileerd met /clr (Common Language Runtime Compilation).
Voorbeeld: Beheerde matrix doorgeven aan niet-beheerde functie
In het volgende voorbeeld ziet u hoe u een beheerde matrix doorgeeft aan een niet-beheerde functie. De beheerde functie gebruikt pin_ptr (C++/CLI) om garbage collection voor de array te onderdrukken voordat de niet-beheerde functie wordt aangeroepen. Door de onbeheerde functie met een vastgemaakte aanwijzer in de GC-heap op te geven, kan de overhead van het maken van een kopie van de matrix worden vermeden. Om te laten zien dat de niet-beheerde functie toegang heeft tot heap-geheugen van de GC, wordt de inhoud van de matrix gewijzigd en worden de wijzigingen doorgevoerd wanneer de beheerde functie het besturingselement hervat.
// 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]);
}
Voorbeeld: Niet-beheerde matrix doorgeven aan beheerde functie
In het volgende voorbeeld ziet u hoe u een onbeheerde matrix doorgeeft aan een beheerde functie. De beheerde functie heeft rechtstreeks toegang tot het matrixgeheugen (in tegenstelling tot het maken van een beheerde matrix en het kopiëren van de matrixinhoud), zodat wijzigingen die door de beheerde functie zijn aangebracht, worden weergegeven in de onbeheerde functie wanneer deze weer controle krijgt.
// 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();
}