GC.KeepAlive() 将确保对象保持在作用域内,直到采用 KeepAlive 方法。
HandleRef 允许封送处理程序在 P/Invoke 的持续时间内使对象保持活动状态。 方法签名中可以使用该类型,而不是 IntPtr。 SafeHandle 可有效地替换此类,应改为使用此类型。
GCHandle 允许固定托管对象和获取指向该类型的本机指针。 基本模式是:
GCHandle handle = GCHandle.Alloc(obj, GCHandleType.Pinned);
IntPtr ptr = handle.AddrOfPinnedObject();
handle.Free();
固定不是 GCHandle 的默认设置。 其他主要模式是通过本机代码将引用传递到托管对象并返回到托管代码(通常使用回调)。 模式如下:
GCHandle handle = GCHandle.Alloc(obj);
SomeNativeEnumerator(callbackDelegate, GCHandle.ToIntPtr(handle));
// In the callback
GCHandle handle = GCHandle.FromIntPtr(param);
object managedObject = handle.Target;
// After the last callback
handle.Free();
请务必注意需要显式释放 GCHandle 以避免内存泄漏。
网友评论