Partilhar via


Como: Manter referência de objeto na memória não gerenciada

Você pode usar gcroot.h, que encapsula GCHandle, para manter uma referência de objeto CLR na memória não gerenciada. Alternativamente, você pode usar GCHandle diretamente.

Exemplos

// 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 Fornece um meio de manter uma referência de objeto gerenciado na memória não gerenciada. Utiliza o método Alloc para criar um identificador opaco para um objeto gerido e o método Free para libertá-lo. Além disso, o método Target permite que obtenha a referência do objeto a partir do manipulador no código gerido.

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

Ver também

Usando a Interoperação C++ (PInvoke implícito)