Aracılığıyla paylaş


Nasıl yapılır: Yönetilmeyen Bellekte Nesne Başvurusunu Tutma

ClR nesne başvurularını yönetilmeyen bellekte tutmak için sarmalayan GCHandlegcroot.h kullanabilirsiniz. Alternatif olarak, doğrudan kullanabilirsiniz GCHandle .

Örnekler

// 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 yönetilen nesne başvurularını yönetilmeyen bellekte tutmanız için bir araç sağlar. Yönetilen bir nesneye Alloc opak tanıtıcı oluşturmak ve Free serbest bırakmak için yöntemini kullanırsınız. Ayrıca yöntemi, Target yönetilen koddaki tanıtıcıdan nesne başvuruyu geri almanıza olanak tanır.

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

Ayrıca bkz.

C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)