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/