Comment : marshaler des pointeurs incorporés à l'aide de l'interopérabilité C++
Les exemples de code suivants utilisent les directives #pragma managed, unmanaged pour implémenter des fonctions managées et non managées dans le même fichier, mais ces fonctions interagissent de la même manière si elles sont définies dans des fichiers séparés.Les fichiers qui contiennent uniquement des fonctions non managées ne doivent pas être compilés avec /clr (Compilation pour le Common Language Runtime).
Exemple
L'exemple suivant montre comment une fonction non managée qui prend une structure contenant des pointeurs peut être appelée à partir d'une fonction managée.La fonction managée crée une instance de la structure et initialise le pointeur incorporé avec le mot clé new (plutôt que le mot clé ref new, gcnew (extensions du composant C++)).Comme cette opération alloue la mémoire sur le tas natif, il n'est pas nécessaire d'épingler le tableau pour supprimer le garbage collection.Toutefois, la mémoire doit être supprimée explicitement pour éviter toute fuite de mémoire.
// marshal_embedded_pointer.cpp
// compile with: /clr
#include <iostream>
using namespace System;
using namespace System::Runtime::InteropServices;
// unmanaged struct
struct ListStruct {
int count;
double* item;
};
#pragma unmanaged
void UnmanagedTakesListStruct(ListStruct list) {
printf_s("[unmanaged] count = %d\n", list.count);
for (int i=0; i<list.count; i++)
printf_s("array[%d] = %f\n", i, list.item[i]);
}
#pragma managed
int main() {
ListStruct list;
list.count = 10;
list.item = new double[list.count];
Console::WriteLine("[managed] count = {0}", list.count);
Random^ r = gcnew Random(0);
for (int i=0; i<list.count; i++) {
list.item[i] = r->NextDouble() * 100.0;
Console::WriteLine("array[{0}] = {1}", i, list.item[i]);
}
UnmanagedTakesListStruct( list );
delete list.item;
}