Gewusst wie: Deklarieren von Handles in systemeigenen Typen

Sie können keinen Handletyp in einem systemeigenen Typ deklarieren. vcclr.h stellt die typsichere Wrappervorlage gcroot bereit, die auf ein CLR-Objekt aus dem C++-Heap verweist. Mit dieser Vorlage können Sie ein virtuelles Handle in einen systemeigenen Typ einbetten und so behandeln, als wäre es der zugrunde liegende Typ. In den meisten Fällen können Sie das gcroot Objekt als eingebetteten Typ ohne Umwandlung verwenden. Allerdings müssen Sie für jedes, in, verwenden static_cast , um den zugrunde liegenden verwalteten Verweis abzurufen.

Die gcroot Vorlage wird mithilfe der Möglichkeiten der Wertklasse System::Runtime::InteropServices::GCHandle implementiert, die "Handles" in den Garbage Collection Heap bereitstellt. Beachten Sie, dass die Handles selbst nicht garbage collection sind und freigegeben werden, wenn der Destruktor in der gcroot Klasse nicht mehr verwendet wird (dieser Destruktor kann nicht manuell aufgerufen werden). Wenn Sie ein gcroot Objekt auf dem systemeigenen Heap instanziieren, müssen Sie die Löschung für diese Ressource aufrufen.

Die Laufzeit Standard eine Zuordnung zwischen dem Handle und dem CLR-Objekt enthalten, auf das verwiesen wird. Wenn das CLR-Objekt mit dem garbage-collection heap verschoben wird, gibt das Handle die neue Adresse des Objekts zurück. Eine Variable muss nicht angeheftet werden, bevor sie einer gcroot Vorlage zugewiesen wird.

Beispiele

In diesem Beispiel wird gezeigt, wie Sie ein gcroot Objekt im systemeigenen Stapel erstellen.

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

In diesem Beispiel wird gezeigt, wie Sie ein gcroot Objekt auf dem systemeigenen Heap erstellen.

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

In diesem Beispiel wird gezeigt, wie gcroot Verweise auf Werttypen (keine Verweistypen) in einem systemeigenen Typ mithilfe gcroot des Feldtyps aufbewahrt werden.

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

Siehe auch

Verwenden von C++-Interop (implizites PInvoke)