簡體   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