DLL导入中的SafeFileHandle

时间:2013-03-01 09:51:05

标签: c# pinvoke

这是我第一次使用P / Invoke与设备驱动程序进行交互。在DeviceIoControl函数中,我使用SafeFileHandle来处理设备,pinvoke.net说:

  

如果您使用SafeFileHandle,请不要调用CloseHandle,因为CLR会为您关闭它。

但在C#Cookbook中,我发现了CloseHandle的这种签名:

[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool CloseHandle(SafeFileHandle hObject);

真相是什么?

2 个答案:

答案 0 :(得分:5)

SafeFileHandle在其CloseHandle方法内部调用ReleaseHandle,并且旨在与Disposable模式一起使用,因此您不希望手动关闭处理CloseHandle(SafeFileHandle)(只需调用Close方法,或Dispose代替)。

由于SafeFileHandlesealed,我在“public static extern bool CloseHandle(SafeFileHandle hObject);”签名中看不到任何意义。


修改

我只是用Google搜索了your book并找到了一个CloseHandle(SafeFileHandle)引用。正如预期的那样,它没有被使用,SafeFileHandle使用以下方式正确关闭:

private void ClosePipe() 
{ 
    if (!_handle.IsInvalid) 
    { 
        _handle.Close(); 
    } 
}

答案 1 :(得分:1)

您看到的是Win32-API函数关闭打开的handle。 当您使用Win32-C / C ++并使用系统句柄时,将使用此函数。我无法在上述声明中100%验证CLR,但我想你会没事的,不要使用它。

请参阅MSDN - 关于CloseHandle的文章 - Win32的功能。

此处还有this文章,其中讨论了CLR的GC。