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. Como alternativa, 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. Você usa o Alloc método para criar um identificador opaco em um objeto gerenciado e Free liberá-lo. Além disso, o método Target permite que você obtenha a referência de objeto de volta do identificador no código gerenciado.

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

Confira também

Usando interop do C++ (PInvoke implícito)