Como: Declare as alças de 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 que você incorpore 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 de incorporado sem projeção. No entanto, com for each, in, você deve usar static_cast para recuperar a referência gerenciado subjacente.

O gcroot modelo é implementado usando as facilidades da classe de valor System::Runtime::InteropServices::GCHandle, que oferece "alças" na pilha de coletor de lixo. Observe que as alças em si não são lixo coletado e são liberados quando não estiver em uso por um destruidor na gcroot classe (esse destruidor não pode ser chamado manualmente). Se você instancia um gcroot de objetos no heap nativo, você deve chamar delete no recurso.

O runtime manterá uma associação entre o identificador e o objeto CLR, que faz referência a ele. Quando o objeto CLR se move com a pilha de coletor de lixo, a alça irá retornar o novo endereço do objeto. Uma variável não precisa ser fixado antes que ele é 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 nativa.

// 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 gcroot para conter referências aos tipos de valor (não a 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);
}
  

Consulte também

Referência

Usar a interoperabilidade de C++ (PInvoke implícito)