Ngoại lệ ngoại lệ có thể xảy ra khi sử dụng PInvoke hoặc tất cả các lỗi được xử lý bởi phương thức trả về giá trị và nhà phát triển có thể kiểm tra và nêu ngoại lệ nếu cần không?.NET PInvoke Exception Handling
Trả lời
Với P/Gọi an toàn để nói rằng có hai loại lỗi bạn cần xử lý.
- Trường hợp ngoại lệ được ném bởi P/Gọi chính nó.
- lỗi được trả về bởi các dll bạn đang gọi/
Với nhóm 1 có một vài trường hợp ngoại lệ có thể xảy ra (không phải là danh sách dứt khoát):
- EntryPointNotFoundException
- ExecutionEngineException
- MissingMethodException
- NotSupportedException
Với nhóm 2, bạn cần kiểm tra kết quả trả về của cuộc gọi hàm/gọi hàm P/được gọi và hành động phù hợp. Marshal.GetLastWin32Error() có ích ở đây.
Đây là lý do tại sao tốt nhất nên tạo lớp bao bọc cho bất kỳ nội dung gốc nào bạn cần sử dụng. Bằng cách đó, bạn có thể chuyển đổi kết quả trả về của mình thành ngoại lệ và tách mã được quản lý và riêng của bạn.
Tôi không chắc chắn nếu có một danh sách dứt khoát của các ngoại lệ có thể được ném ra, nhưng tôi biết ít nhất những điều sau có thể xảy ra
- AccessViolationException
- StackOverflowException
- ngoại lệ khi DLL tên không tìm thấy. không thể nhớ loại ra khỏi đỉnh đầu của tôi
- OutOfMemoryException
Hầu hết các loại ngoại lệ là không cụ thể cho PInvoke và có thể xảy ra ở bất kỳ điểm nào trong chương trình. Người duy nhất cụ thể cho cuộc gọi PInvoke là DLL không tìm thấy ngoại lệ (loại người tôi không thể nhớ).
pinvoke cũng ném một MissingMethodException
trên các thiết bị di động, khi quá trình này ra khỏi bộ nhớ: http://www.tomergabel.com/NETCompactFrameworkPInvokeAndMissingMethodException.aspx
Ngoài ra:
DllNotFoundException
BadImageFormatException
(DLL là sai định dạng hoặc bị hỏng)MethodAccessException
(Cố gắng bằng phương pháp bảo mật trong suốt để gọi mã gốc)