Comment : stocker la référence d'un objet dans une mémoire non managée
Vous pouvez utiliser gcroot.h, qui encapsule GCHandle, pour stocker une référence d'objet du CLR dans la mémoire non managée. Vous pouvez aussi utiliser directement GCHandle.
Exemple
// 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();
}
GCHandle vous donne un moyen de stocker une référence d'objet managé dans la mémoire non managée. Vous pouvez utiliser la méthode Alloc pour créer un handle opaque vers un objet managé et Free pour le libérer. En outre, la méthode Target vous permet de récupérer la référence de l'objet à partir du handle dans du code managé.
// 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();
}