我正在与需要获取和释放非托管资源的第三方库进行通信。经过一番阅读,我得出结论,管理资源引用的最佳和“正确”方法是在 aSafeHandle
或CriticalHandle
object 中。
我的问题出现了,因为第三方库返回的句柄是无符号短数值,而不是指针。如果我MarshalAsAttribute
在返回的句柄上指定 ,我会得到一个MarshalDirectiveException
(CriticalHandles 不能有 MarshalAs 属性集并且不能在数组中使用)。
以下是我考虑过的事情:
- 以数字格式编组句柄并
CriticalHandle
通过Criticalhandle.SetHandle
方法将它们包装在 a 中。如果在获取引用和封装它之间引发异常,这可能会泄漏句柄。 - 以数字格式编组和存储句柄。具有包含类型的实现
CriticalFinalizerObject
。如果在获取引用和封装它之间引发异常,这可能会泄漏句柄。 - 将句柄编组为 a
SafeHandle
(IntPtr
让最重要的 2 个字节填充准垃圾)。每次DangerousGetHandle
我需要调用带有SafeHandle
. 这将防止手柄的任何潜在泄漏,但非常麻烦并且看起来使用蛮力使错误的解决方案起作用。
我应该如何处理这些“把手”?