2009-08-29 114 views
12

我讀比爾·瓦格納的書有效的C#。在第32條中,他倡導開發人員創建可以更容易重用的更小,更具內聚性的程序集。然而,他在同一個項目中說:.NET跨大會的性能損失

...額外的安全檢查也是 跨裝配界限完成。從同一裝配 同所有 代碼有信任的同一級別(不 一定是相同的訪問權限, 但不變的真理水平)。所述 CLR執行某些安全檢查 每當碼流跨越一個組件 邊界。本次少你 程序流程跨越裝配 界限,更高效的將 是......這些性能無 關切應該從 勸阻你分手過於 大型裝配。表現處罰爲 未成年人。

我的問題是,有沒有額外的安全檢查執行每個方法調用到Foo.dll,或只有第一次加載程序集?

感謝

+0

@Andrew:完成。 – dewald 2009-08-30 22:31:34

回答

12

在.NET的安全系統是相當複雜的。我不確定答案是如乍一看那樣簡單。即使您有一個組件,仍然會執行安全檢查。當您啓動一個包含所有邏輯的應用程序時,您不會繞過用於程序集加載和驗證的.NET安全檢查,也不會繞過類型繼承檢查。但是,一旦安全性在特定範圍內得到驗證,它通常不會再次發生(可能會有一些緩解情況,會強制重新驗證證據。)

多個程序集不會有任何不同的行爲。可能會有一些額外的裝配成本和初始類型訪問成本,因爲每個新裝配將需要這些初始安全檢查。但是,與JITting代碼本身的過程相比,這些檢查通常會顯得蒼白無力。

除了基本的組件負載和類型安全檢查,你也可以有明確的權限要求。微軟系統命名空間充斥着Demand和LinkDemand安全檢查,這些安全檢查驗證堆棧(需求)中的所有呼叫者或直接呼叫者(鏈路需求)是否有權進行呼叫。 (你的代碼也應該包括這樣的檢查,以確認調用者是否具有適當的權限。)無論代碼在哪裏居住......在本地,在另一個程序集或甚至在另一個應用程序域的程序集中,這些安全檢查都會發生。但是,一旦進入到其他應用程序域或進程,甚至服務和其他服務器的調用中,封送這些調用和建立連接的開銷就會更加昂貴。

這甚至不是全貌,當談到.NET安全。一些安全檢查比其他安全檢查更昂貴。有些需要證書,有些則需要證據等。安全性不是你可以推卸的東西......它是現代軟件開發的一個基本和重要組成部分。我不會太擔心安全成本......因爲它在.NET框架和CLR中得到很好的實施和優化。我會盡力確保您的應用程序的架構和組織得當。如果將代碼分離爲多個程序集是合乎邏輯的,減少維護,部署和重構工作,那麼它的WELL值得的安全成本很小。

4

當CLR加載程序集的那些安全檢查完成。裝配完成後,不需要進一步的安全檢查。

4

我也看了比爾·瓦格納的書的推移而有關於性能同樣的疑惑,所以我認爲基準測試我們目前開發的應用程序:

有幾十萬可達3-4萬個電話給我們的C#類之一。

如果這個類在同一個程序集或另一個程序集中,只要它們在同一個進程和域中的同一臺機器上,它就沒有區別。我無法測量任何重大的性能損失!

當然,如果需要封送呼叫,情況就不同了。也許非常不同...