Tôi đã xác định một cấu trúc để gửi qua ổ cắm. Tôi muốn có kích thước của nó nhưng sizeof
không an toàn và giống nhau cho "System.Runtime.InteropServices.MarshalSizeOf
". Có cách nào để có được kích thước của nó một cách an toàn không?C# lý do tại sao sizeof là không an toàn và làm thế nào để có được kích thước của một cấu trúc một cách an toàn?
Trả lời
Không có cách nào để thực hiện điều đó cho các cấu trúc được quản lý. Marshal.SizeOf
sẽ chỉ trả lại kích thước của dữ liệu trên các loại so khớp bao gồm cấu trúc ... MIGHT là chính xác cho các loại được quản lý trên một số nền tảng chứ không phải trên các nền tảng khác.
Điều này là do thiết kế sao cho JIT có thể đặt các cấu trúc khác nhau tùy thuộc vào nền tảng mà nó chạy.
Thông tin thêm ở đây: Chris Brumme's blog
Câu hỏi quan trọng là tại sao bạn cần phải biết kích thước của cấu trúc? Tỷ lệ là vì một lý do không an toàn (trong trường hợp này bạn có thể sử dụng 'sizeof') hoặc nó cho một P/Invoke (trong trường hợp đó' Marshal.SizeOf' là câu trả lời đúng). – Gabe
Đồng ý. Đã cố gắng trả lời câu hỏi ban đầu: "tại sao sizeof không an toàn và làm thế nào để có được kích thước của một cấu trúc một cách an toàn?" :-) – Jcl
Một lý do: bạn muốn tạo một mảng nhiều cấu trúc và bạn cần phải biết có bao nhiêu cấu trúc sẽ phù hợp với 2 GB. Bạn cần phải biết bao nhiêu bộ nhớ thời gian chạy sẽ phân bổ cho cấu trúc. –
Xem my blog post cho một thư viện wrapper cho phép bạn xác định những gì các JIT sẽ xác định kích thước các loại được quản lý sẽ được (khi chạy). Nó hoạt động bằng cách sử dụng lệnh sizeof
IL không được hiển thị trong C#. Nó có thể được chạy mà không có quyền đặc biệt nào cả và có thể kiểm chứng được.
Lưu ý: điều này có thể hoặc không thể là những gì bạn thực sự muốn. Điều này có thể trả về 8
cho một cấu trúc thực sự chỉ có một byte trong đó. Tôi không thực sự hiểu câu hỏi của bạn hoàn toàn, vì vậy tôi không chắc chắn nếu điều này thực sự là những gì bạn muốn hay không.
- 1. Lý do tại sao Hibernate's sessionFactory là thread an toàn
- 2. Mã an toàn và không an toàn
- 3. An toàn loại an toàn()
- 4. IFRAME an toàn được lồng trên trang không an toàn
- 5. Cấu trúc bản đồ có an toàn không?
- 6. Làm thế nào để kiểm tra kích thước của tệp được tải lên một cách an toàn trong bottlepy?
- 7. sizeof() cấu trúc không xác định. Tại sao?
- 8. Làm thế nào đoạn C này có thể được viết một cách an toàn hơn?
- 9. Chuỗi an toàn của Netty Channel.write có an toàn không?
- 10. Mảng an toàn không có khóa an toàn
- 11. Làm cách nào để ghi một tệp an toàn?
- 12. Tại sao bộ đệm kích thước cố định (mảng) phải không an toàn?
- 13. Tại sao mã này không phải là chuỗi an toàn?
- 14. Tại sao nó an toàn hơn để sử dụng sizeof (* con trỏ) trong malloc
- 15. Có an toàn khi trả lại cấu trúc trong C hoặc C++ không?
- 16. Xử lý "An toàn" của Mutex?
- 17. Tại sao ReadOnlyDictionary không an toàn?
- 18. C socket API có an toàn không?
- 19. Thiết kế cấu trúc dữ liệu an toàn chủ đề
- 20. Kích thước ngăn xếp của chủ đề an toàn?
- 21. biểu thức Lambda cho cấu trúc lại an toàn ArgumentException
- 22. Tại sao IntPtr không cần từ khóa không an toàn?
- 23. Chủ đề của bảng Guava có an toàn khi bản đồ sao lưu của nó là an toàn không?
- 24. Biến an toàn phiên PHP an toàn như thế nào?
- 25. Làm thế nào để đọc một cách an toàn các thuộc tính của một WebScriptObject?
- 26. DWScript có an toàn không?
- 27. Làm thế nào để CopyOnWriteArrayList có thể an toàn luồng?
- 28. Có an toàn khi giả định rằng một con trỏ có kích thước của một int trong C không?
- 29. Làm thế nào an toàn là MD5 và SHA1
- 30. Mã C sau có an toàn không?
Xác định an toàn. 'Marshal.SizeOf' là hoàn toàn an toàn như xa như CLR là có liên quan. – Noldorin
Noldorin - Marshal.SizeOf yêu cầu quyền UnSafe Code được thiết lập để thực thi. Đây là vấn đề của OP –
Tôi đã thử System.Runtime.InteropServices.MarshalSizeOf (typeof (MyStruct)) và không "không an toàn" ở bất cứ đâu và cũng bỏ chọn hộp kiểm Cho phép mã không an toàn. Nó hoạt động tốt với tôi bây giờ. ?????? – 5YrsLaterDBA