Partilhar via


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

Você pode usar gcroot.h, que envolve GCHandle, para manter uma referência de objeto CLR na memória não gerenciado. Como alternativa, você pode usar GCHandle diretamente.

Exemplo

// 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 isso significa manter uma referência de objeto na memória não gerenciado. Você usa o método de Alloc para criar um identificador opaca em um objeto gerenciado e a Free para solte. Além disso, o método de Target permite que você obtenha a parte da referência de objeto de identificador em 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();
}
  

Consulte também

Referência

Usando interop C++ (PInvoke implícito)