Compartilhar via


Como: Segure referência de objeto função nativo

Você pode usar gcroot.h, que encapsula GCHandle, para Isenção uma referência de objeto CLR em memória não gerenciada. 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();
}

StringWrapper::x == ManagedString

GCHandle Fornece um meio para manter uma referência de objeto gerenciado na memória não gerenciada. Você usa o Alloc método para criar um identificador opaco para um objeto gerenciado e Free para liberá-lo. Além disso, a Target método lhe permite obter a referência de objeto volta do identificador de 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();
}

StringWrapper::m_handle == ManagedString

Consulte também

Referência

Usando a interoperabilidade de C++ (PInvoke implícita)