2010-03-10 26 views
5

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?

+0

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

+1

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 –

+0

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

Trả lời

3

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

+3

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

+1

Đồ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

+1

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. –

0

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.

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