Gewusst wie: Objektverweis in nicht verwaltetem Arbeitsspeicher

Sie können gcroot.h verwenden, um einen CLR-Objektverweis GCHandleim nicht verwalteten Speicher zu speichern. Alternativ können Sie sie direkt verwenden GCHandle .

Beispiele

// 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 bietet Ihnen eine Möglichkeit, einen verwalteten Objektverweis im nicht verwalteten Speicher zu speichern. Sie verwenden die Alloc Methode, um ein undurchsichtiges Handle für ein verwaltetes Objekt zu erstellen und Free freizugeben. Außerdem können Sie mit der Target Methode den Objektverweis aus dem Handle im verwalteten Code abrufen.

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

Siehe auch

Verwenden von C++-Interop (implizites PInvoke)