首先,描述一下AppDomain是什麼:當一個程序集被執行時,系統就會自動為其創建一個AppDomain,每一個AppDomain屬於某個進程,一個進程內可以有多個AppDomain;每個AppDomain創建時都有個默認的名稱,該名稱就是加載的程序集的名稱(帶擴展名.exe)。
同一windows 進程內的不同AppDomian之間可以互相共享資源,如:CLR,基本.NET類型,地址空間及線程。
程序集在AppDomain中的調用:在同一進程內,如果不同的AppDomain調用同一Assembly會有以下兩種情況:
1、會在每個AppDomain中加載該Assembly並為各AppDomain所調用;
2、會在該進程內,不在任何的AppDomain中單據加載該Assembly,然後同一進程內的所有AppDomain都可以對其進行調用。這種方式加載的程序集(Assembly)稱為域無關(Domain Neutral)的。
AppDomain和線程的關系式正交的;n<--->n的關系。
注意當AppDomain加載了某個Assembly後就無法將其單獨卸載,不過可以講AppDomain卸載掉。
卸載AppDomain時CLR會卸載當前在該AppDomain執行的所有線程,如果此時在執行非托管代碼就可能產生問題,並且改AppDomain中所有的托管對象也會被垃圾回收器強制回收;
AppDomain的孤立性:
1)、一個AppDomain可以獨立於其他的AppDomain被卸載掉;
2)、一個AppDomain不能放問其他AppDomain內的Assembly和對象;
3)、若沒有發生跨邊界的異常拋出,一個AppDomain擁有自己獨立的異常管理策略。這也就意味著同一進程內的某一AppDomain發生異常不會影響到其他的AppDomain。
4)、每個AppDomain可以定義獨自的程序集代碼訪問安全策略;
5)、每個AppDomain可以定義獨自的規則,以便在CLR加載前定位程序集的位置