繁体   English   中英

DLL导入中的SafeFileHandle

[英]SafeFileHandle in DLL import

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

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

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

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

真相是什么?

SafeFileHandle在其ReleaseHandle方法内部调用CloseHandle ,并且设计用于Disposable模式,因此您不希望使用CloseHandle(SafeFileHandle)手动关闭句柄(只需调用Close方法或Dispose )。

SafeFileHandlesealed ,我真的没有看到“ public static extern bool CloseHandle(SafeFileHandle hObject); ”签名中的任何一点。


编辑

我只是用Google搜索了你的书 ,发现了一个CloseHandle(SafeFileHandle)参考。 正如预期的那样,它没有被使用, SafeFileHandle使用以下方法正确关闭:

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

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

有关Win32的CloseHandle函数,请参阅MSDN -article。

这里还有这篇文章,它讨论了CLR的GC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM