5

P/Invokeを使用してデバイスドライバーを操作する必要があるのはこれが初めてです。DeviceIoControl関数では、デバイスへのハンドルにSafeFileHandleを使用し、pinvoke.netは次のように述べています。

SafeFileHandleを使用する場合は、CLRによって閉じられるため、CloseHandleを呼び出さないでください。

しかし、C#クックブックで、CloseHandleのこの種の署名を見つけました。

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

真実は何ですか?

4

2 に答える 2

6

SafeFileHandleCloseHandleそのReleaseHandleメソッドを内部的に呼び出し、Disposableパターンで使用するように設計されているため、でハンドルを手動で閉じる必要はありません(代わりにメソッドまたはをCloseHandle(SafeFileHandle)呼び出すだけです)。CloseDispose

そして、現状でSafeFileHandleは、「 」の署名sealedには実際には何の意味もありません。public static extern bool CloseHandle(SafeFileHandle hObject);


編集

私はあなたの本CloseHandle(SafeFileHandle)をグーグルで検索し、1つの参照を見つけました。予想どおり、使用されておらず、次を使用してSafeFileHandle適切に閉じられています。

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

開いているものを閉じるためのWin32-API関数がありますhandle。この関数は、Win32-C / C ++を使用していて、システムハンドルを操作する場合に使用します。上記のステートメントをCLRについて100%検証することはできませんが、使用しないで問題ないと思います。

Win32の-functionに関するMSDNの記事を参照してくださいCloseHandle

また、CLRのGCについて説明しているこの記事もここにあります。

于 2013-03-01T10:14:01.533 に答える