第二十二章 CLR寄宿和AppDomain

22.1 CLR寄宿服務器

22.2 AppDomain函數

22.3 卸載AppDomain測試

22.4 監視AppDomian線程

22.5 AppDomain FirstChance異常通知設計

22.6 宿主如何使用AppDomain代理

22.7 高級宿主控制調試

22.1 CLR寄宿

 .NET Framework在Windows平臺頂部運行。這意味着.NET Framework必須用Windows能理解的技術來構建。首先,全部託管模塊和程序集文件都必須使用Windows PE文件格式,並且要麼是Windows EXE文件,要麼是DLL文件。對象

開發CLR時,Microsoft實際是把它實現成包含在一個DLL中的COM服務器。也就是說,Microsoft爲CLR定義了一個標準的COM接口,併爲該接口和COM服務器分配了GUID。安裝.NET Framework時,表明CLR的COM服務器和其餘COM服務器同樣在Windows註冊表中註冊。接口

 任何Windows應用程序都能寄宿(容納)CLR。但不要經過調用CoCreateInstance來建立CLR COM服務器實例,相反,你的非託管宿主應該調用MetaHost.h文件中聲明的CLRCreateInstance函數。進程

宿主應用程序可調用ICLRRuntimeHost接口定義的方法:

設置宿主管理器。告訴CLR宿主向參與涉及如下操做的決策:內存分配,線程調度/同步以及程序集加載。宿主還可聲明它想得到有關垃圾回收啓動和中止以及特定操做超時的通知

獲取CLR管理。告訴CLR阻止使用某些類/成員。另外,宿主能分辨哪些代碼能夠調試,哪些不能夠,以及當特定事件(例如AppDomain卸載,CLR中止或這堆棧溢出異常)發生時宿主應調用哪一個方法。

初始化並啓動CLR

加載程序集並執行其中的代碼

中止CLR,阻止任何更多的託管代碼在Windows進程中運行。

22.2 AppDomain

 CLR COM服務器初始化時會建立一個AppDomain。AppDomain是一組程序集的邏輯容器。CLR初始化時建立的第一個AppDomain稱爲「默認AppDomain」,這個默認的AppDomain只有在Windows進程終止時纔會被銷燬。

除了默認AppDomain,正在使用非託管COM接口方法或託管類型方法的宿主還可要求CLR建立額外的AppDomain。AppDomain是爲了提供隔離而設計的。具體功能:

一個AppDomain的代碼不能直接訪問另外一個AppDomain的代碼建立的對象。一個AppDomain中的代碼要訪問另外一個AppDomain中的對象,只能使用「按引用封送」或者「按值封送」的語義。

AppDomain能夠卸載

AppDomain能夠單獨保護

AppDomain能夠單獨配置

 跨越AppDomain邊界訪問對象

22.3 卸載AppDomain

1.CLR掛起進程中執行過託管代碼的全部線程。

2.CLR檢查全部線程,查看哪些線程正在執行要卸載的App Domain中的代碼,或者哪些線程會在某個時候返回至要卸載的AppDomain。

3.當第2步發現的全部線程都離開AppDomain後,CLR遍歷堆,爲引用了「由已卸載的AppDomain建立的對象」的每一個代理對象都設置一個標誌。

4.CLR強制垃圾回收,回收由已卸載的AppDomain建立的任何對象的內存。

5.CLR恢復剩餘全部線程的執行。 

22.4 監視AppDomian

 宿主應用程序可監視AppDomain消耗的資源。

22.5 AppDomain FirstChance異常通知

 每一個AppDomain均可關聯一組回調方法:CLR開始查找AppDomain中的catch塊時,這些回調方法將得以調用。

CLR處理異常:異常首次拋出時,CLR調用向拋出異常的AppDomain登記的全部FirstChanceException回調方法。而後,CLR查找棧上在同一個AppDomain中的任何catch塊。有一個catch塊能處理異常,則異常處理完成,將繼續正常執行。若是AppDomian中沒有一個catch塊能處理異常,則CLR沿着棧向上來到調用AppDomain,再次拋出同一個異常對象。 

22.6 宿主如何使用AppDomain

6.1 可執行應用程序

自寄宿應用程序,它們都有託管EXE文件。Windows用託管文件初始化進程時,會加載墊片。墊片檢查應用程序的程序集中的CLR頭信息。頭信息指明瞭生成和測試應用程序時使用的CLR版本

。墊片根據這些信息決定將哪一個版本的CLR加載到進程中,CLR加載並初始化好以後,會再次檢查程序集的CLR頭,判斷哪一個方法是應用程序的入口方。CLR調用該方法。

代碼運行時會訪問其餘類型,引用另外一個程序集的類型時,CLR會定位所須要的程序集,並將其加載到同一個AppDomian中。應用程序的Main方法返回後,Windows進程終止(銷燬默認AppDomain和其餘全部AppDomain)。

6.2 Microsoft Silverlight富Internet應用程序

6.3 Microsoft ASP.NET 和XML Web服務應用程序

ASP.NET做爲一個ISPAPI(APSNet_ISAPI.dll)實現。客戶端首次請求由這個DLL處理URL時,ASP.NET會加載CLR。客戶端請求一個Web應用程序,ASP.NET判斷這是否是第一次請求。若是是,ASP.NET要求CLR爲該Web應用程序建立新AppDomain;每一個Web應用程序都根據虛擬根目錄來標誌。而後,ASP.NET要求CLR將包含應用程序所公開類型的程序集加載到新AppDomain中,建立該類型的實列,並調用其中的方法響應客戶端的Web請求。若是代碼引用了更多的類型,CLR將所須要的程序集加載到Web應用程序的AppDomain中。

6.4 Microsoft SQL Server

6.5 更多的用法只侷限於想象力

22.7 高級宿主控制

7.1使用託管代碼管理CLR

7.2 寫健壯的宿主應用程序

託管代碼出現錯誤時,宿主可告訴CLR採起什麼行動:

若是線程執行時間過長,CLR可終止線程並返回一個響應。

CLR可卸載App Domain。

CLR可被禁用。

CLR可退出Windows進程。

CLR能夠得體地或者粗魯地終止線程或AppDomain。

7.3 宿主如何拿回它的線程

相關文章
相關標籤/搜索