Partager via


Comment : déclarer des handles dans les types natifs

Mise à jour : novembre 2007

Vous ne pouvez pas déclarer de type de handle dans un type natif. vcclr.h fournit le modèle gcroot de wrapper de type sécurisé, pour faire référence à un objet CLR du tas C++. Ce modèle vous permet d'incorporer un handle virtuel dans un type natif et de le traiter comme s'il était le type sous-jacent.

Le modèle gcroot est implémenté à l'aide des fonctionnalités de la classe value System::Runtime::InteropServices::GCHandle, qui fournit des "handles" dans le tas récupéré par le garbage collector. Notez que les handles eux-mêmes ne sont pas récupérés par le garbage collector et sont libérés lorsqu'ils ne sont plus utilisés par le destructeur dans la classe gcroot (ce destructeur ne peut pas être appelé manuellement). Si vous instanciez un objet gcroot sur le tas natif, vous devez appeler delete sur cette ressource.

L'exécution maintiendra une association entre le handle et l'objet CLR qu'il référence. Lorsque l'objet CLR est déplacé avec le tas récupéré par le garbage collector, le handle retourne la nouvelle adresse de l'objet. Il n'est pas nécessaire qu'une variable soit épinglée avant d'être assignée à un modèle gcroot.

Exemple

Cet exemple montre comment créer un objet gcroot sur la pile native.

// mcpp_gcroot.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;

class CppClass {
public:
   gcroot<String^> str;   // can use str as if it were String^
   CppClass() {}
};

int main() {
   CppClass c;
   c.str = gcnew String("hello");
   Console::WriteLine( c.str );   // no cast required
}

hello

Cet exemple montre comment créer un objet gcroot sur le tas natif.

// mcpp_gcroot_2.cpp
// compile with: /clr
// compile with: /clr
#include <vcclr.h>
using namespace System;

struct CppClass {
   gcroot<String ^> * str;
   CppClass() : str(new gcroot<String ^>) {}

   ~CppClass() { delete str; }

};

int main() {
   CppClass c;
   *c.str = gcnew String("hello");
   Console::WriteLine( *c.str );
}

hello

Cet exemple montre comment utiliser gcroot pour contenir des références à des types valeur (et non des types référence) dans un type natif en utilisant gcroot sur le type boxed.

// mcpp_gcroot_3.cpp
// compile with: /clr
#include < vcclr.h >
using namespace System;

public value struct V {
   String^ str;
};

class Native {
public:
   gcroot< V^ > v_handle;
};

int main() {
   Native native;
   V v;
   native.v_handle = v;
   native.v_handle->str = "Hello";
   Console::WriteLine("String in V: {0}", native.v_handle->str);
}

String in V: Hello

Voir aussi

Référence

Utilisation de l'interopérabilité C++ (PInvoke implicite)