这是我第一次使用P / Invoke与设备驱动程序进行交互。在DeviceIoControl函数中,我使用SafeFileHandle来处理设备,pinvoke.net说:
如果您使用SafeFileHandle,请不要调用CloseHandle,因为CLR会为您关闭它。
但在C#Cookbook中,我发现了CloseHandle的这种签名:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CloseHandle(SafeFileHandle hObject);
真相是什么?
答案 0 :(得分:5)
SafeFileHandle
在其CloseHandle
方法内部调用ReleaseHandle
,并且旨在与Disposable
模式一起使用,因此您不希望手动关闭处理CloseHandle(SafeFileHandle)
(只需调用Close
方法,或Dispose
代替)。
由于SafeFileHandle
为sealed
,我在“public static extern bool CloseHandle(SafeFileHandle hObject);
”签名中看不到任何意义。
修改
我只是用Google搜索了your book并找到了一个CloseHandle(SafeFileHandle)
引用。正如预期的那样,它没有被使用,SafeFileHandle
使用以下方式正确关闭:
private void ClosePipe()
{
if (!_handle.IsInvalid)
{
_handle.Close();
}
}
答案 1 :(得分:1)