5

这是我第一次需要使用 P/Invoke 与设备驱动程序交互。在 DeviceIoControl 函数中,我使用 SafeFileHandle 作为设备句柄,pinvoke.net说:

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

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

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

真相是什么?

4

2 回答 2

6

SafeFileHandle内部调用CloseHandleReleaseHandle方法,并且设计用于与Disposable模式一起使用,因此您不想手动关闭句柄CloseHandle(SafeFileHandle)(只需调用该Close方法,或者Dispose,而不是)。

照原样SafeFileHandlesealed我真的看不出“ public static extern bool CloseHandle(SafeFileHandle hObject);”签名中有任何意义。


编辑

我刚刚用谷歌搜索了你的书,找到了一个CloseHandle(SafeFileHandle)参考。正如预期的那样,它没有被使用,并且SafeFileHandle使用以下方法正确关闭:

private void ClosePipe() 
{ 
    if (!_handle.IsInvalid) 
    { 
        _handle.Close(); 
    } 
}
于 2013-03-01T10:15:25.920 回答
1

你看到的是 Win32-API 函数来关闭一个打开的handle. 当您使用 Win32-C/C++ 并使用系统句柄时,将使用此功能。我不能 100% 地验证上述关于 CLR 的陈述,但我想你会没事的,不要使用它。

请参阅有关Win32 的 -function的MSDN文章。CloseHandle

这里也有这篇文章,讲的是CLR的GC。

于 2013-03-01T10:14:01.533 回答