这两种结构的关键是防止垃圾收集器在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调用执行过程中类对象被垃圾收集,那么这就是应用程序中的错误.我实际上希望通过异常通知失败,而不是隐藏它.
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |