2010-03-10 47 views
5

我已經定義了一個通過套接字發送的結構。我想得到它的大小,但sizeof是不安全的,並且對於「System.Runtime.InteropServices.MarshalSizeOf」也是如此。有沒有辦法以安全的方式獲得尺寸?C#爲什麼sizeof是不安全的,以及如何以安全的方式獲取結構的大小?

+0

定義安全。就CLR而言,Marshal.SizeOf是完全安全的。 – Noldorin 2010-03-10 16:50:52

+1

Noldorin - Marshal.SizeOf要求執行UnSafe Code權限。這是OP的問題 – 2010-03-10 16:53:55

+0

我試過System.Runtime.InteropServices.MarshalSizeOf(typeof(MyStruct))並且在任何地方都沒有「unsafe」,也沒有選中Allow unsafe code複選框。現在對我來說很好。 ?????? – 5YrsLaterDBA 2010-03-10 17:07:22

回答

3

無法爲託管結構執行此操作。 Marshal.SizeOf將僅返回構成結構的編組類型數據的大小...... 可能對於某些平臺上的託管類型是正確的,但對其他平臺沒有。

這是由設計決定的,所以JIT可以根據運行的平臺對結構進行不同的佈局。

此處瞭解詳情:Chris Brumme's blog

+3

重要的問題是爲什麼你需要知道結構的大小?可能是因爲一個不安全的原因(在這種情況下你可以使用'sizeof')或者它是一個P/Invoke(在這種情況下'Marshal.SizeOf'是正確的答案)。 – Gabe 2011-02-11 22:22:33

+1

同意。只是想回答最初的問題:「爲什麼sizeof是不安全的,以及如何以安全的方式獲取結構體的大小?」 :-) – Jcl 2011-02-11 23:15:40

+1

原因之一:你想創建一個包含許多結構的數組,並且你需要知道有多少可以放入2GB。您需要知道運行時將爲該結構分配多少內存。 – 2012-11-14 05:07:18

0

的包裝庫,讓你判斷一下JIT將定義託管類型的大小將是(在運行時)查看my blog post。它通過使用在C#中完全不公開的IL指令sizeof來工作。它可以在沒有特別許可的情況下運行,並且可以驗證。

注意:這可能是也可能不是你真正想要的。對於實際上只有一個字節的結構,這可能會返回8。我完全不瞭解你的問題,所以我不確定這是否是你想要的。

相關問題