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)