Partager via


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 contenir une référence d’objet CLR en mémoire non managée. Vous pouvez également utiliser GCHandle directement.

Exemples

// 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 vous donne un moyen de contenir une référence d’objet managé en mémoire non managée. Vous utilisez la Alloc méthode pour créer un handle opaque sur un objet managé et Free le libérer. En outre, la Target méthode vous permet d’obtenir la référence d’objet à partir du handle dans le 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();
}
StringWrapper::m_handle == ManagedString

Voir aussi

Utilisation de l’interopérabilité C++ (PInvoke implicite)