標籤:
#1 CLR寄宿:
開發CLR時,Microsoft實際是將他實現成包含在一個dll中的COM伺服器。Microsoft為CLR定義了一個標準的COM介面,並為該介面和COM伺服器分配了GUID。安裝.NET Framework時,代表CLR的COM伺服器在Windows註冊表中註冊。
任何Windows應用程式都可以寄宿CLR,非託管宿主應該調用MetaHost.h檔案中聲明的CLRCreateInstance函數,該函數是在MSCoreEE.dll檔案中實現的,該dll被稱為"墊片"(shim),主要用於決定建立哪個版本的CLR,本身不包含CLR COM伺服器。
對於1.0,1.1和2.0,CLR代碼在MSCorWks.dll檔案中;對於4.0版本,CLR代碼在Clr.dll檔案中。
CLRCreateInstance函數可以返回一個ICLRMetaHost介面。宿主應用程式可以調用這個介面的GetRuntime函數,指定宿主要建立的CLR版本。然後,墊片將所需版本的CLR載入到宿主程式的進程中。
GetRuntime函數返回一個指向非託管介面ICLRRuntimeInfo的指標,利用該介面的GetInterface方法獲得ICLRRuntimeHost介面。
隨著.NET Framework 4.0的發布,Microsoft支援在一個Windows進程中同時載入CLR v2.0和v4.0,允許為.NET Framework 2.0和4.0寫的不同組件同時運行。可以利用ClrVer.exe工具檢查在任何給定的進程中,載入了哪個(哪些)版本的CLR.
一個CLR載入到一個Windows進程中後,便永遠不能卸載,CLR從進程中卸載的唯一方式是終止進程,這導致Windows清理進程使用的所有資源,包括CLR在內。
#2 AppDomain:
CLR COM伺服器初始化時,會建立一個AppDomain。AppDomain是一組程式集的邏輯容器。CLR初始化時建立的第一個AppDomain稱為預設AppDomain,這個預設的AppDomain只有在Windows進程終止時才會被銷毀。
AppDomain唯一的作用就是進行隔離:
一個AppDomain中的代碼建立的對象不能由另一個AppDomain中的代碼直接存取,只能使用"按引用封送"或者"按值封送"的語義。
AppDomain可以卸載、可以單獨保護、可以單獨實施配置。
Clr Via C#讀書筆記---CLR寄宿和應用程式定義域