2009-03-04 58 views
4

當我使用Reflector時,我經常遇到很多不安全的代碼。任何人都知道.NET有多少是不受管理/安全的?有多少.NET是非託管的?

+0

.NET中的哪一部分是你正在談論的?除非您自己指定代碼不安全,否則您的代碼不會不安全。 – 2009-03-04 21:30:32

+0

這將如何負責?你想要測量代碼行嗎? – 2009-03-04 21:32:37

+0

幾乎所有的部分都像查看列表,數組類。 – 2009-03-04 21:32:55

回答

0

因爲不安全的調用被相應的.NET對象封裝,所以它並不重要。你需要關心的是資源分配和處理實現IDisposable的對象。

6

有許多PInvoke實例只是調用Win32 API。但是,在CLR本身中實現了一些功能(例如,互鎖操作)。如果你想看看如何完成,請看Rotor

我在我的博客上對this post進行了鎖定(查看轉子源)的詳細說明。

要明確回答您的問題,您必須獲取所有.NET源代碼(例如,使用NetMassDownloader和grep表示「InternalCall」或「DllImport」),並將其與所有行的計數進行比較。也許你可以將這些「非託管」行中的每一行乘以某個要素來猜測,或者你必須潛入Rotor或Windows源代碼才能得到實際的數字。如果你走了這麼遠,那麼事情就會變得模糊(例如,如果File.Open調用Win32的CreateFile,那麼CreateFile應該算在.NET上?我想不是)。所以,充其量只能通過一些因素來推測「InternalCall」。

1

許多System.Windows.Forms調用非託管windows API,但我還沒有發現需要手動處理在這個命名空間中創建的對象。

當使用System.IO.FileStream類(也調用非託管代碼)時,請確保在完成後調用Dispose,以便可以保證文件在那裏關閉,然後代替執行終結器。

6

這是一個很難回答的問題。不安全的代碼很容易量化,因爲它存在於二進制文件中,可以用IL指令來衡量。

真正的非託管代碼,比如說PInvoke或者COM,在二進制文件中有代碼,但是它並不重要。它只表示調用本機函數所需的最小存根。這意味着您無法真正衡量在受管DLL中正在執行多少本機代碼。你所能做的就是測量調用的數量,它不能真正衡量非託管代碼執行的程度。