簡體   English   中英

應用程序域用於什么?

[英]What are app domains used for?

我大致了解AppDomain是什么,但我並不完全了解AppDomain的用途。

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

特別是:

  • 我理解一個域中的錯誤或致命異常不會影響在同一進程中運行的其他應用程序域 - 這是否也適用於非托管/ C ++異常,甚至可能是堆損壞或其他內存問題。
  • AppDomain間通信如何工作?
  • 如何使用AppDomains與簡單地生成許多進程有什么不同?

AppDomain的基本用例是在托管第三方代碼的環境中,因此不僅需要動態加載程序集,還需要卸載它們

沒有辦法單獨卸載組件。 因此,您必須創建一個單獨的AppDomain來容納可能需要卸載的任何內容。 然后,您可以在必要時刪除並重建整個AppDomain。

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

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

在回答你的觀點/問題時:

  • AppDomains不會保護您的應用程序免受惡意非托管代碼的侵害。 如果這是一個問題,您很可能需要使用操作系統提供的完整進程隔離。

  • AppDomains之間的通信使用.NET遠程執行來強制隔離。 這可以通過引用編組或按值語義編組,在性能和靈活性之間進行權衡。

  • AppDomains是一種在托管代碼中實現隔離等過程的輕量級方法。 AppDomains被認為是輕量級的,因為您可以在單個進程中創建多個AppDomain,因此它們可以避免多個OS進程的資源和性能開銷。 此外,單個線程可以在一個AppDomain中執行代碼,然后在另一個AppDomain中執行代碼,因為Windows對AppDomains一無所知(請參閱使用System.AppDomain.CurrentDomain)

其實,這是正確的,關鍵在一個失敗AppDomain不能影響別人。 在壞事的情況下,最好還是打破這個過程。 有幾個例子,但老實說我沒有記住它們 - 我只是心理上記下了“糟糕的事情=拆除過程(檢查)”

AppDomain好處:

  • 你可以卸載一個AppDomain ; 我將它用於一個基於來自數據庫的數據編譯自身(元編程)的系統 - 它可以啟動一個appdomain來托管新的dll一段時間,然后在新數據可用(並構建)時安全地交換它
  • AppDomain之間的通信相對便宜。 IMO這是唯一一次我很樂意使用遠程處理(雖然你仍然需要非常小心邊界上的對象,以避免它們之間出現引用,導致“融合”將額外的dll加載到主AppDomain ,導致泄漏) - 它也很容易 - 只是CreateInstanceAndUnwrap (或者它是CreateInstanceFromAndUnwrap ?)。
  • vs一個額外的過程 - 你可以去任何一個方向; 但是你不需要另一個用於AppDomain工作的exe,並且設置你需要的任何通信要容易得多

我並不是自稱是AppDomains的專家,所以我的回答並不是無所不包。 也許我應該首先鏈接到一個有點專家的人的精彩介紹,以及覆蓋AppDomain使用的所有方面的內容

我自己與AppDomains的主要遭遇是在安全領域。 在那里,我發現的最大優勢是能夠以高信任度運行主域,從而產生具有受限權限的多個子域。 通過限制高信任度的權限,而不使用應用程序域,受限制的進程仍然可以提升自己的權限。

用於運行完全獨立的代碼模塊的App Domain隔離策略,以解決內存共享和穩定性問題,更多的是一種錯覺而非現實。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM