Freigeben über


Gewusst wie: Objektverweis in nicht verwaltetem Arbeitsspeicher

Sie können gcroot.h verwenden, das GCHandle umschließt, um einen CLR-Objektverweis in nicht verwaltetem Arbeitsspeicher zu halten.Wahlweise können Sie GCHandle direkt verwenden.

Beispiel

// 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 ermöglicht Ihnen, in einem nicht verwalteten Arbeitsspeicher einen verwalteten Objektverweis zu halten.Mit der Alloc-Methode erstellen Sie ein nicht transparentes Handle für ein verwaltetes Objekt, und mit Free geben Sie es frei.Außerdem können Sie den Objektverweis von dem Handle in verwaltetem Code zurückholen, indem Sie die Target-Methode verwenden.

// 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();
}
  

Siehe auch

Referenz

Verwenden von C++-Interop (implizites PInvoke)