Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a témakör a Visual C++ együttműködés egyik aspektusát mutatja be. További információ: C++ Interop (Implicit PInvoke) használata.
Az alábbi példakódok a felügyelt, nem felügyelt #pragma irányelveket használják a felügyelt és nem felügyelt függvények ugyanazon fájlban való implementálásához, de ezek a függvények ugyanúgy működnek együtt, ha külön fájlokban vannak definiálva. A csak nem felügyelt függvényeket tartalmazó fájlokat nem kell a /clr (Common Language Runtime Compilation) használatával lefordítani.
Példa: Felügyelt tömb átadása nem felügyelt függvénynek
Az alábbi példa bemutatja, hogyan adhat át egy felügyelt tömböt egy nem felügyelt függvénynek. A felügyelt függvény pin_ptr (C++/CLI) használatával tiltja le a tömb szemétgyűjtését, mielőtt meghívja a nem felügyelt függvényt. Ha a nem felügyelt függvényt rögzített mutatóval adhatja meg a GC-halomba, elkerülhető a tömb másolásának többlettere. Annak bemutatásához, hogy a nem felügyelt függvény hozzáfér a GC halommemóriához, módosítja a tömb tartalmát, és a változások akkor jelennek meg, amikor a felügyelt függvény folytatja a vezérlést.
// 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]);
}
Példa: Nem kezelt tömb átadása kezelt függvénynek
Az alábbi példa egy nem felügyelt tömb felügyelt függvénynek való átadását mutatja be. A felügyelt függvény közvetlenül hozzáfér a tömbmemóriához (szemben a felügyelt tömb létrehozásával és a tömb tartalmának másolásával), így a felügyelt függvény által végrehajtott módosítások megjelennek a nem felügyelt függvényben, amikor visszanyeri az irányítást.
// 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();
}