更新:2007 年 11 月
可以使用 gcroot.h(该文件包装了 GCHandle)在非托管内存中保存 CLR 对象引用。也可以直接使用 GCHandle。
示例
// 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 为您提供在非托管内存中保存托管对象引用的方式。 可以使用 Alloc 方法创建托管对象的不透明句柄,并使用 Free 方法释放该句柄。另外,Target 方法允许您从托管代码的句柄中取回对象引用。
// 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