AppDomain 相似於一個輕量級進程,它是 .net / mono 代碼運行時的一個邏輯容器。web
通常狀況下,咱們開發的代碼都運行在「運行時」爲咱們建立的 AppDomain 中(即默認 AppDomain),察覺不到 AppDomain 的存在,也不太須要關注 AppDomain。但在另一些狀況下,有可能須要在應用程序中建立其餘 AppDomain,例如:安全
- 動態卸載程序集:咱們知道在 .net / mono 中,能夠在運行時動態加載程序集,但卻沒法將已加載到內存的特定程序集卸載掉,這意味着在程序運行期間沒法更新被加載的程序集。而這個功能在某些程序設計中是很是必要的,最多見的就是插件架構。此外,因爲已加載的程序集要在應用程序結束時才被釋放,這也形成了沒必要要的內存佔用。如今,經過 AppDomain 能夠實現此目的。
- 實現程序集隔離:一些容易引發崩潰的代碼能夠考慮單獨運行在一個 AppDomain 中。譬如,Asp.net 中就利用不一樣的 AppDomain 來防止一個應用程序的崩潰影響其餘 Asp.net 應用程序,同時還能夠在不重啓系統、不重啓 IIS、不影響 Asp.net 自身服務的狀況下將一個 AppDomain 卸載掉,而後啓動新的 AppDomain,理想狀況下能夠實現 web 系統的長時間在線(這以往是昂貴的 unix 的特性,如今終於被微軟「借鑑」了)。
- 限制代碼安全權限:在一些狀況下,爲了防止某些非受信代碼可能對其餘 AppDomain 形成的潛在有害影響,能夠對其應用不一樣的安全級別,以確保關鍵資源的安全性。
- 加載相同程序集的不一樣版本:這個在 COM 時代是一個大問題,如今經過 AppDomain,便可實如今一個進程中同時加載不一樣版本的兩個程序集,且能夠作到良好的兼容性。
- 有效利用資源:從性能上考慮,有些程序集可能會消耗大量資源,儘管在託管環境下基本上不存在資源消耗漏洞,但總會存在特定時間密集訪問、形成大量資源消耗的狀況,這時能夠考慮建立單獨的 AppDomain,在資源消耗超過臨界點後卸載 AppDomain,以適應系統運行要求。
- 減小內存佔用:在.net 中容許不一樣 AppDomain 共享程序集,前提是這些程序集必須具備強名稱,且位於 GAC 中。例如,在 Asp.net 中,程序集共享策略默認使用的是 MultiDomainHost,這意味着 GAC 中全部程序集都將做爲共享 (domain neutral) 程序集被全部 AppDomain(即全部 Asp.Net 應用程序)共用,咱們能夠想象獲得這能夠帶來多少內存節約。