Cómo: Declarar controladores en tipos nativos

Actualización: noviembre 2007

No se puede declarar un tipo de identificador en un tipo nativo. vcclr.h proporciona la plantilla de contenedor gcroot con seguridad de tipos, para hacer referencia a un objeto CLR del montón de C++. Esta plantilla permite incrustar un identificador virtual en un tipo nativo y tratarlo como si fuera el tipo subyacente.

La plantilla gcroot se implementa utilizando los medios de la clase de valor System::Runtime::InteropServices::GCHandle, que proporciona "identificadores" en la pila de recolección de elementos no utilizados. Observe que los propios identificadores no se recolectan como elementos no utilizados y se liberan cuando ya no los usa el destructor en la clase gcroot (este destructor no se puede llamar manualmente). Si crea instancias de un objeto gcroot en la pila nativa, deberá llamar a delete en ese recurso.

El tiempo de ejecución mantendrá una asociación entre el identificador y el objeto CLR, a los que hace referencia. Si el objeto CLR se desplaza con la pila de recolección de elementos no utilizados, el identificador devolverá la nueva dirección del objeto. No se debe fijar una variable antes de asignarla a una plantilla gcroot.

Ejemplo

Este ejemplo muestra cómo crear un objeto gcroot en la pila nativa.

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

Este ejemplo muestra cómo crear un objeto gcroot en el montón 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

Este ejemplo muestra cómo utilizar gcroot para mantener referencias a tipos de valor (no tipos de referencia) en un tipo nativo mediante gcroot en el tipo al que se le ha aplicado una conversión boxing.

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

Vea también

Referencia

Utilizar la interoperabilidad de C++ (PInvoke implícito)