HandleRef和GCHandle有什么区别?

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.handleref.aspx

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.aspx

谢谢

最佳答案

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

我从文档中收集到的是,HandleRef本质上是更通用的GCHandle结构的特例。
HandleRef结构专门用于将句柄包装到与P/Invoke代码一起使用的非托管资源。例如,窗口句柄(HWND)或设备上下文(HDC)。它具有Handle属性,该属性返回IntPtr类型的值,该值为底层系统体系结构上的指针大小的整数值。您可以使用它来快速轻松地获取包装的 handle 。
GCHandle结构允许使用GCHandleType枚举的成员之一指定其包装的句柄类型,而HandleRef结构是专门设计用于将句柄包装到非托管资源的。直接处理非托管内存时,可能会使用GCHandle结构,而不是将Win32 API视为黑盒的特殊句柄。

不需要使用任何一个。可以简单地调用GC.KeepAlive来防止垃圾收集器过早地释放资源。

甚至那可能也没有必要。我多年来一直在编写P/Invoke代码,但我发现,只要正确编写了P/Invoke代码,就不需要这两种结构。如果在API调用处于执行过程中时类对象被垃圾回收,那么这就是您的应用程序中的错误。我实际上想通过异常通知失败,而不是隐藏它。

关于c# - HandleRef和GCHandle有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8563039/

10-10 18:06