2013-03-01 23 views
5

Đây là lần đầu tiên tôi cần sử dụng P/Invoke để tương tác với trình điều khiển thiết bị. Trong chức năng DeviceIoControl tôi sử dụng SafeFileHandle cho xử lý đến thiết bị và pinvoke.net nói:SafeFileHandle trong nhập DLL

Nếu bạn sử dụng một SafeFileHandle, đừng gọi CloseHandle như CLR sẽ đóng nó lại cho bạn.

Nhưng trong C# Cookbook tôi thấy chữ ký loại CloseHandle:

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

sự thật là gì?

+0

Nếu bạn muốn chịu trách nhiệm gọi 'CloseHandle' thì hãy khai báo xử lý của bạn thành' IntPtr'. –

+0

@ David Heffernan, tôi chỉ không muốn đối phó với IntPtrs. Tôi đã nhầm lẫn khi tình cờ gặp đoạn mã này tại C# Cookbook. – Oksana

+0

Nếu bạn định gọi 'DeviceIoControl' thì tôi đề nghị bạn vượt qua nỗi sợ của bạn về' IntPtr'. –

Trả lời

5

SafeFileHandle nội bộ gọi CloseHandle trong phương pháp ReleaseHandle của nó, và được thiết kế để sử dụng với một mô hình Disposable, do đó bạn không muốn tự đóng xử lý với CloseHandle(SafeFileHandle) (chỉ cần gọi phương thức Close, hoặc Dispose, thay vào đó) .

Và dưới dạng SafeFileHandlesealed, tôi thực sự không thấy bất kỳ điểm nào trong chữ ký "public static extern bool CloseHandle(SafeFileHandle hObject);".


EDIT

Tôi chỉ googled your book và tìm thấy một CloseHandle(SafeFileHandle) tham khảo. Như mong đợi, nó không được sử dụng và SafeFileHandle được đóng lại đúng cách bằng cách sử dụng:

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

nó được thêm vào rõ ràng, cảm ơn. – Oksana

1

Những gì bạn thấy có chức năng Win32-API để đóng mở handle. Chức năng này sẽ được sử dụng khi bạn đang sử dụng Win32-C/C++ và làm việc với các hệ thống xử lý. Tôi không thể xác nhận tuyên bố trên 100% về CLR, nhưng tôi đoán bạn sẽ ổn, không sử dụng nó.

Xem MSDN -article trên CloseHandle -function cho Win32.

Ngoài ra còn có this bài viết ở đây, nói về GC của CLR.

+0

[Đào vào IDisposable] (http://msdn.microsoft.com/en-us/magazine/cc163392.aspx#S7) - bài viết hay và rất hữu ích cho tôi, cảm ơn. – Oksana

+0

@Oksana bạn được chào đón :) –

Các vấn đề liên quan