Có thể truy cập biến "errno" trong C# khi P/Gọi không? Điều này tương tự như Win32 GetLastError().Truy cập C biến toàn cầu 'errno' từ C#
Trả lời
Tôi khá chắc chắn rằng có một cách, nhưng nó có lẽ là một ý tưởng tồi. Làm thế nào bạn sẽ đảm bảo rằng thời gian chạy đã không được gọi là một số chức năng CRT trong quá trình xử lý nội bộ của nó đã ảnh hưởng đến errno
?
Vì lý do tương tự, bạn cũng không nên gọi trực tiếp số GetLastError
. Các DllImportAttribute
cung cấp một tài sản SetLastError
để thời gian chạy biết ngay lập tức nắm bắt được lỗi cuối cùng và lưu trữ nó ở một nơi mà mã được quản lý có thể đọc bằng cách sử dụng Marshal.GetLastWin32Error
.
Tôi nghĩ rằng điều mạnh mẽ nhất bạn có thể làm trong trường hợp này là tạo một DLL C thực hiện cả công việc C thực tế và chụp errno
. (Lưu ý rằng chỉ cần viết một wrapper xung quanh chụp errno
vẫn sẽ có những mối quan tâm được đề cập ở trên.)
Có, có thể - GetLastError
thực hiện chính xác điều đó. Tuy nhiên, như binarycoder đã chỉ ra, bạn không nên thực hiện điều này trực tiếp - thay vào đó, hãy đặt SetLastError
trên DllImport
để tự động thực hiện và lưu trữ bộ nhớ cache (và để tránh các vấn đề đa luồng hoặc các hàm gọi thời gian sửa đổi giá trị errno
) - P/Chức năng được viện dẫn, kiểm tra trạng thái trả về của nó và nếu nó hiển thị một điều kiện lỗi - hãy ném Win32Exception
, tự động đọc giá trị của lỗi cuối cùng. Có, ngay cả trên Mono trên Linux.
Giải pháp là sử dụng SetLastError
trên DllImport
. Điều này sẽ làm cho thời gian chạy lưu lỗi cuối cùng để có thể truy cập từ Marshal.GetLastWin32Error
.
Có hai vấn đề với gọi GetLastError
trực tiếp:
- Thời gian chạy có thể làm đôi sau khi PInvoke trả trước khi bạn có thể nhận được lỗi cuối cùng
- Nhiều chủ đề .NET có thể cư trú trên cùng một mẹ đẻ chủ đề. Điều này có thể dẫn đến 2 chủ đề .NET thực hiện PInvokes, các thư viện nguyên gốc không biết gì tốt hơn, sau đó sẽ ghi đè lên lỗi cuối cùng. Vì vậy, thread A in .NET nhận được lỗi cuối cùng của thread B (có khả năng).
Bạn có thể hiển thị ví dụ về cú pháp để sử dụng 'SetLastError' trên' DllImport' không? –
- 1. Làm thế nào để truy cập một biến toàn cầu Python từ C?
- 2. Biến C# ASP.NET C# là toàn cầu?
- 3. Đặt biến LUA_PATH toàn cầu từ C++/C?
- 4. Truy cập biến toàn cầu từ bên trong một lớp
- 5. Truy cập toàn cầu so với biến cục bộ
- 6. C++ Biến toàn cầu trên nhiều tệp
- 7. Truy cập toàn cầu trong Java
- 8. dlopen và biến toàn cầu trong C/C++
- 9. Đặt một biến toàn cầu trong một luồng - C#
- 10. Truy cập các biến toàn cầu chính của chương trình từ thư viện động dlopen() trong C trên OS X
- 11. C++: Khai báo một lớp toàn cầu và truy cập nó từ các lớp khác?
- 12. biến toàn cầu trong C là tĩnh hay không?
- 13. C++ truy cập các biến/đối tượng toàn cầu trong không gian tên có biến/đối tượng có cùng tên
- 14. Java namespace toàn cầu truy cập
- 15. truy cập biến đồng thời trong c
- 16. ước đặt tên trong C# - Biến toàn cầu
- 17. Truy cập các biến toàn cầu từ một hàm trong mô-đun đã nhập
- 18. Biến Python toàn cầu không cập nhật
- 19. C: Nhanh hơn, truy cập biến toàn cục hoặc chuyển con trỏ đến hàm
- 20. Biến toàn cầu v Cài đặt trong C#
- 21. On biến tĩnh địa phương và toàn cầu trong C++
- 22. IOError: [Errno 13] không thể truy cập tệp GAE
- 23. Làm thế nào để truy cập toàn cầu vào các loại enum trong C#?
- 24. Biến toàn cục trong C# .net
- 25. Truy cập chức năng C++ từ QML
- 26. Có biến Toàn cầu trong EXT JS
- 27. Biến toàn cầu và MPI
- 28. Truy cập yêu cầu web trên toàn cầu ở Tornado
- 29. C# Chủ đề an toàn nhanh (est) truy cập
- 30. Truy cập Bảo mật Đăng ký bị từ chối. C#
Vâng, tôi đồng ý với điều này. Nó có lẽ sẽ là tốt hơn để thiết lập một wrapper C một chức năng mục tiêu mà lần lượt sẽ trả về giá trị của errno từ đó. – supercheetah