Como: Declare identificadores em tipos nativos
Você não pode declarar um tipo de identificador em um tipo nativo.vcclr.h fornece o modelo de tipo seguro wrapper gcroot para se referir a um objeto CLR do heap C++.Este modelo permite incorporar um identificador virtual em um tipo nativo e tratá-lo como se fosse o tipo subjacente.Na maioria dos casos, você pode usar o gcroot o objeto como o tipo incorporado sem qualquer elenco.No entanto, com para cada um, em, você deve usar static_cast para recuperar a referência gerenciada subjacente.
O gcroot modelo é implementado usando os recursos da classe de valor System::Runtime::InteropServices::GCHandle, que fornece "alças" na pilha de coletor.Observe que as alças de si não são lixo coletado e liberados quando não estiver em uso por destruidor na gcroot classe (esse destruidor não pode ser chamado manualmente).Se você instanciar um gcroot de objeto no heap nativo, você deve chamar excluir no recurso.
O tempo de execução manterá uma associação entre a alça e o objeto CLR, que faz referência.Quando move o objeto CLR com a pilha de coleta de lixo, a alça irá retornar o novo endereço do objeto.Uma variável não tem de ser fixado antes de ser atribuído a uma gcroot modelo.
Exemplo
Este exemplo mostra como criar um gcroot o objeto na pilha 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
}
Este exemplo mostra como criar um gcroot o objeto no 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 );
}
Este exemplo mostra como usar o gcroot para manter referências a tipos de valor (não tipos de referência) em um tipo nativo usando gcroot no tipo de processador in a box.
// 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);
}