https://msdn.microsoft.com/zh-cn/library/aeb4be4k(v=vs.140).aspx
如何:在非托管内存中保存对象引用
Visual Studio 2015
若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。
可以使用 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