Cod*_*ray 7

这两种结构的关键是防止垃圾收集器在P/Invoke调用完成之前释放资源并使句柄无效.您链接的文档表明这些是interop marshaller识别的特殊类型.

我从文档中收集的内容HandleRef基本上是更一般GCHandle结构的特例.

HandleRef结构专门用于将句柄包装到与P/Invoke代码一起使用的非托管资源.例如,窗口句柄(HWND)或设备上下文(HDC).它有一个Handle返回type值的属性IntPtr,它是一个整数值,它是底层系统体系结构上指针的大小.您可以使用它快速轻松地获取它包装的手柄.

虽然GCHandle结构允许使用GCHandleType枚举的一个成员指定它包装的句柄类型,但该HandleRef结构专门用于将句柄包装到非托管资源.GCHandle当您直接处理非托管内存时,可能会使用该结构,而不是Win32 API将其视为黑盒子的特殊句柄.

没有必要使用它们.人们可以简单地调用GC.KeepAlive以防止垃圾收集器过早释放资源.

即使这可能也没有必要.我多年来一直在编写P/Invoke代码,我发现当它正确编写时,不需要这些结构中的任何一个.如果在API调用执行过程中类对象被垃圾收集,那么这就是应用程序中的错误.我实际上希望通过异常通知失败,而不是隐藏它.