2008-09-18 65 views
44

的好例子,我一直在採訪在問有關的AppDomain,並I know the basics使用的AppDomain

  • 他們的應用程序中的隔離級別(使他們的應用程序不同)
  • 他們可以有螺紋(使他們線程不同)
  • 例外在一個AppDomain中不影響其他
  • 的AppDomain不能訪問彼此的記憶
  • 每個應用程序域可以有不同的安全

我仍然沒有得到什麼使他們有必要。我正在尋找一個合理的具體情況,當你使用一個。

答案:

  • 不可信代碼
    • 核心應用程序保護
      不可信/第三方插件從腐敗共享內存和非授權禁止訪問註冊表或單獨的應用程序域通過隔離硬盤驅動器有安全限制,保護應用程序或服務器。例如ASP.NET和SQL服務器託管組件代碼
  • 可信代碼
    • 穩定性
      應用分成安全,獨立的特性/功能
    • 架構的靈活性
      自由跑單CLR實例中的多個應用程序或者各自的程序。

還有什麼?

回答

49

可能最常見的一種是加載包含來自不受信任方的插件代碼的程序集。代碼在自己的AppDomain中運行,隔離應用程序。

另外,無法卸載特定程序集,但可以卸載AppDomains。

對於全破敗,克里斯Brumme對這個龐大的博客條目:

http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

+0

+1鏈接到克里斯Brumme的博客文章。必讀。 – dotnetguy 2012-12-10 08:47:29

4

如果您創建一個應用程序,它允許第三方插件,您可以在加載這些插件一個獨立的AppDomain,這樣你的主應用程序就可以安全的從未知的代碼。

對於單個工作進程中的每個Web應用程序,ASP.NET也使用單獨的AppDomains。

4

應用程序域對於應用程序的穩定性非常好。

通過讓您的應用程序包含一箇中央進程,然後在單獨的應用程序域中生成「功能」,您可以防止全局崩潰,如果其中一個失敗。

3

據我瞭解的AppDomain的設計,讓主機實體(操作系統,數據庫,服務器等)的自由跑單CLR實例或在自己的每個項目中的多個應用程序。所以它是主機而不是應用程序開發人員的問題。

這與Java相媲美,你總是有每個應用程序1個JVM,往往導致運行在JVM中並肩複製資源的多個實例。

7

我認爲有AppDomain的主要動機是CLR的設計者希望隔離管理的代碼不會產生多個Windows進程的性能開銷的方法。如果CLR最初是在UNIX之上實現的(創建多個進程的成本顯着降低),AppDomains可能永遠不會被髮明。

此外,而在第三方應用程序管理插件架構絕對是一個很好用的AppDomain中,它們存在的更大的原因是衆所周知的主機,如SQL Server 2005和ASP.NET。例如,ASP.NET託管服務提供商可以提供共享託管解決方案,該解決方案支持來自多個客戶的多個站點,這些站點都位於單個Windows進程下運行的相同框上。

14

AppDomain的另一個好處(就像你在你的問題中提到的那樣)是你加載到它的代碼可以運行不同的安全權限。例如,我編寫了一個動態加載DLL的應用程序。我是一名教練,這些是我加載的學生DLL。我不想讓一些心懷不滿的學生消滅我的硬盤驅動器或損壞我的註冊表,所以我將代碼從它們的DLL加載到單獨的AppDomain中,該AppDomain沒有文件IO權限或註冊表編輯權限,甚至無法顯示新窗口(它實際上只有執行權限)。

3

我看到2或3用於創建單獨的應用程序的域主用例:具有低的資源使用和開銷

1)過程狀隔離。例如,這就是ASP.NET所做的 - 它將每個網站託管在單獨的應用程序域中。如果它在單個應用程序域中使用不同的線程,那麼不同網站的代碼可能會相互干擾。如果它在不同的進程中託管不同的網站 - 與進程間通信相比,它將使用大量資源並且進程間通信相對困難。

2)在具有特定安全權限的單獨應用程序域中執行不可信代碼(實際上與第一個原因有關)。正如人們已經說過的,您可以將第三方插件或不受信任的dll加載到單獨的應用程序域中。

3)能力卸載組件,以減少不必要的內存使用情況。不幸的是,無法從應用程序域卸載程序集。因此,如果您將一些大型程序集加載到主應用程序域,那麼在該程序集之後釋放相應內存的唯一方法就是不再需要關閉應用程序。在不需要這些程序集的情況下,將程序集加載到單獨的應用程序域中並卸載該應用程序域即可解決此問題。