讓我們在開始本節內容之前先了解以下幾個基本概念。
應用程序域
應用程序域(通常簡稱為AppDomain)可以視為一種輕量級進程。一個Windows進程內可以包含多個AppDomain。AppDomain這個概念的提出是為了實現在一個物理服務器中承載多個應用程序,並且這些應用能夠相互獨立。ASP.Net中利用AppDomain在同一個進程內承載了多組Web應用程序就是一個例子。實際上微軟曾進行過在單一進程內承載多達1000個簡單Web應用程序的壓力測試。
使用AppDomain所獲得的性能優勢主要體現在兩方面:
·創建AppDomain所需要的系統資源比創建一個Windows進程更少。
·同一個Windows進程內所承載的AppDomain之間可以互相共享資源,如CLR、基本.Net類型、地址空間以及線程。
而各個AppDomain之間的獨立性體現為以下這些特征:
·一個AppDomain可以獨立於其他的AppDomain而被卸載。
·一個AppDomain無法訪問其他AppDomain的程序集和對象。
·若沒有發生跨邊界的異常拋出,一個AppDomain擁有自己獨立的異常管理策略。這意味著一個AppDomain內出現問題不會影響到同一個進程內中的其他AppDomain。
·每個AppDomain可以分別定義獨自的程序集代碼訪問安全策略。
·每個AppDomain可以分別定義獨自的規則以便CLR在加載前定位程序集所在位置。
可以看出應用程序域是進程中的一個子單元,不過在.NET中還存在一個比應用程序域還要細粒度的單元——.Net上下文(Context)。
.Net Context
一個.NET 應用程序域能夠包含多個被稱為.NET上下文的實體。所有.Net對象都存在於上下文中,每個應用程序域中至少存在一個上下文。這個上下文稱為應用程序域的默認上下文,它在應用程序域創建的時候就創建了。下圖總結了它們之間的關系: