Porady: deklarowanie dojść w typach natywnych

Nie można zadeklarować typu uchwytu w typie natywnym. Plik vcclr.h udostępnia szablon gcroot otoki bezpieczne dla typu, który odwołuje się do obiektu CLR ze sterta języka C++. Ten szablon umożliwia osadzanie dojścia wirtualnego w typie natywnym i traktowanie go tak, jakby był to typ bazowy. W większości przypadków można użyć gcroot obiektu jako typu osadzonego bez rzutu. Jednak w przypadku każdej z nich należy użyć static_cast polecenia w celu pobrania bazowego odwołania zarządzanego.

Szablon gcroot jest implementowany przy użyciu obiektów klasy wartości System::Runtime::InteropServices::GCHandle, który udostępnia "uchwyty" do sterta zbieranego przez śmieci. Należy pamiętać, że same uchwyty nie są zbierane i są zwalniane, gdy nie są już używane przez destruktora w gcroot klasie (nie można wywołać tego destruktora ręcznie). Jeśli utworzysz wystąpienie obiektu na natywnej stercie, musisz wywołać metodę gcroot delete dla tego zasobu.

Środowisko uruchomieniowe zachowa skojarzenie między uchwytem a obiektem CLR, do którego się odwołuje. Gdy obiekt CLR przenosi się ze stertą zbieraną przez śmieci, uchwyt zwróci nowy adres obiektu. Zmienna nie musi być przypięta, zanim zostanie przypisana do szablonu gcroot .

Przykłady

W tym przykładzie pokazano, jak utworzyć gcroot obiekt na stosie natywnym.

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

W tym przykładzie pokazano, jak utworzyć gcroot obiekt na natywnej stercie.

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

W tym przykładzie pokazano, jak używać gcroot do przechowywania odwołań do typów wartości (nie typów odwołań) w typie natywnym przy użyciu gcroot typu w polu.

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

Zobacz też

Korzystanie z międzyoperacyjności języka C++ (niejawna funkcja PInvoke)