2010-02-05 54 views
15

我大致瞭解AppDomain是什麼,但我不完全理解AppDomain的用法。什麼是應用程序域用於?

我參與了一個基於C#/ C++的大型服務器應用程序,我想知道如何使用AppDomain來提高穩定性/安全性/性能。

特別是:

  • 我明白,在一個域中的故障或嚴重異常不影響在同一個進程中運行的其他應用程序域 - 這是否也持有非託管真/ C++異常,甚至可能是堆腐敗或其他內存問題。
  • Inter-AppDomain通信如何工作?
  • 如何使用AppDomain與簡單地產生許多進程不同?
+1

我建議將這個問題分成至少2個 - 有關關於AppDomain間通信的異常問題。 – Mikeon 2010-02-05 12:23:03

回答

13

基本用例一個AppDomain在承載第三方代碼的環境中任何通訊科,所以不僅需要動態加載程序集,還要卸載它們

無法單獨卸載裝配。所以你必須創建一個單獨的AppDomain來存放任何可能需要卸載的東西。然後,您可以在必要時垃圾並重建整個AppDomain。

順便說一句,破壞堆的本機代碼不能被CLR的任何功能保護。最終,CLR是本地實現的,並共享相同的地址空間。所以在這個過程中的本地代碼可以在CLR的內部遍歷!隔離性能不佳(即大多數)本機代碼的唯一方法是在操作系統級別實際進程隔離。啓動多個.exe進程並讓它們通過某種IPC機制進行通信。

+0

我應該澄清 - 我只是指我自己的本地代碼! – 2010-02-19 15:55:54

1

我不是自稱是AppDomain的專家,所以我的答案不會是全面的。也許我應該從一個很有前途的人開始,這個人的確有點像專家,而且看起來像是covering all aspects of AppDomain usage

我自己與AppDomain的主要碰撞一直存在於安全領域。在那裏,我發現的最大優點是能夠讓主域以高信任度運行,產生具有受限權限的多個子域。通過限制高信任度的權限,而不使用應用程序域,受限制的進程仍然有權提升自己的權限。

4

實際上,它是而不是確實一個關鍵失敗AppDomain不能影響其他人。在糟糕的情況下,最好的辦法是推翻這一過程。這裏有幾個例子,但說實話,我沒有記住他們 - 我只是把心裏記「壞事=拆除過程(檢查)」的AppDomain

優點:

  • 可以卸載AppDomain;我使用這個基於來自數據庫的數據編譯自己(元編程)的系統 - 它可以啓動一個appdomain來託管新的dll一段時間,然後在新數據可用(並構建)時安全地交換它,
  • AppDomain之間的通信相對便宜。國際海事組織這是唯一一次我開心使用遠程處理(雖然你仍然需要真的注意在邊界上的對象,以避免他們之間出血的引用,導致「融合」加載到主0123',造成泄漏) - 這真的很容易 - 只是CreateInstanceAndUnwrap(或者是CreateInstanceFromAndUnwrap?)。
  • vs spawing一個額外的過程 - 你可以去任何一種方式;但你並不需要另一個EXE爲AppDomain工作,這是很容易設置,你需要
6

我強烈推薦由Jeffrey Richter提供CLR Via C#。特別是第21章詳細介紹了AppDomains的用途和用途。

在回答您的積分/問題:

  • 的AppDomain不會保護流氓非託管代碼應用程序。如果這是一個問題,您很可能需要使用操作系統提供的完整進程隔離。

  • AppDomains之間的通信是使用.NET Remoting執行的,以實施隔離。這可以通過參考元帥或者價值語義元帥來實現,在性能和靈活性之間進行權衡。

  • AppDomain是一種在託管代碼中實現類似隔離的輕量級方法。 AppDomain被認爲是輕量級的,因爲您可以在單個進程中創建多個AppDomain,因此它們避免了多個OS進程的資源和性能開銷。此外,一個單獨的線程可以在一個AppDomain中在另一個的AppDomain與Windows一無所知的AppDomain執行代碼,然後(見本使用System.AppDomain.CurrentDomain使用)

0
運行完全獨立的代碼

應用程序域隔離策略爲了解決內存共享和穩定性問題,模塊更像是一種虛幻而非現實。

+1

你知道,微軟在ASP.NET核心中刪除了AppDomains ... – docesam 2016-10-27 09:05:10

+0

不,我沒有,但現在我做 – LastTribunal 2016-11-03 20:37:56

相關問題