Condividi tramite


Procedura: dichiarare handle in tipi nativi

Aggiornamento: novembre 2007

Non è possibile dichiarare un handle in un tipo nativo. vcclr.h fornisce il modello di wrapper indipendente dai tipi gcroot per fare riferimento a un oggetto CLR dall'heap C++. Questo modello consente di incorporare un handle virtuale in un tipo nativo e di considerarlo come se fosse il tipo sottostante.

Il modello gcroot viene implementato utilizzando le funzionalità della classe di valori System::Runtime::InteropServices::GCHandle, che inserisce gli "handle" nell'heap sottoposto a Garbage Collection. Si noti che gli handle stessi non vengono sottoposti alla procedura di Garbage Collection e quando non sono più utilizzati dal distruttore presente nella classe gcroot (questo distruttore non può essere chiamato manualmente) vengono liberati. Se si crea l'istanza di un oggetto gcroot nell'heap nativo, per tale risorsa è necessario chiamare il metodo delete.

Il runtime continua a mantenere un'associazione tra l'handle e l'oggetto CLR a cui è riferito. Quando l'oggetto CLR viene spostato con l'heap sottoposto a Garbage Collection, l'handle restituisce il nuovo indirizzo dell'oggetto. Non è necessario bloccare una variabile per poterla assegnare a un modello gcroot.

Esempio

Nell'esempio riportato di seguito viene illustrato come creare un oggetto gcroot nello stack nativo.

// 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

Nell'esempio riportato di seguito viene illustrato come creare un oggetto gcroot nell'heap nativo.

// 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

Nell'esempio riportato di seguito viene illustrato come creare gcroot per mantenere i riferimenti ai tipi di valore (non ai tipi di riferimento) in un tipo nativo utilizzando gcroot nel tipo 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

Vedere anche

Riferimenti

Utilizzo delle funzionalità di interoperabilità C++ (PInvoke implicito)