Gewusst wie: Objektverweis in systemeigener Funktion
Aktualisiert: November 2007
Sie können gcroot.h verwenden, das GCHandle einschließt, um einen CLR-Objektverweis in nicht verwaltetem Arbeitsspeicher zu halten. Wahlweise können Sie GCHandle direkt verwenden.
Beispiel
// hold_object_reference.cpp
// compile with: /clr
#include "gcroot.h"
using namespace System;
#pragma managed
class StringWrapper {
private:
gcroot<String ^ > x;
public:
StringWrapper() {
String ^ str = gcnew String("ManagedString");
x = str;
}
void PrintString() {
String ^ targetStr = x;
Console::WriteLine("StringWrapper::x == {0}", targetStr);
}
};
#pragma unmanaged
int main() {
StringWrapper s;
s.PrintString();
}
StringWrapper::x == ManagedString
GCHandle ermöglicht Ihnen, in einem nicht verwalteten Arbeitsspeicher einen verwalteten Objektverweis zu halten. Mit der Alloc-Methode erstellen Sie ein nicht transparentes Handle für ein verwaltetes Objekt, und mit Free geben Sie es frei. Außerdem können Sie den Objektverweis von dem Handle in verwaltetem Code zurückholen, indem Sie die Target-Methode verwenden.
// hold_object_reference_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
class StringWrapper {
IntPtr m_handle;
public:
StringWrapper() {
String ^ str = gcnew String("ManagedString");
m_handle = static_cast<IntPtr>(GCHandle::Alloc(str));
}
~StringWrapper() {
static_cast<GCHandle>(m_handle).Free();
}
void PrintString() {
String ^ targetStr = safe_cast< String ^ >(static_cast<GCHandle>(m_handle).Target);
Console::WriteLine("StringWrapper::m_handle == {0}", targetStr);
}
};
#pragma unmanaged
int main() {
StringWrapper s;
s.PrintString();
}
StringWrapper::m_handle == ManagedString