標籤:重要 exe 停止 win 決定 pe檔案 pdo get runtime
一、CLR寄宿
.net framework在windows平台的頂部允許。者意味著.net framework必須用windows能理解的技術來構建。所有託管模組和組件檔必須使用windows PE檔案格式,而且要麼是windows exe檔案,要麼是DLL檔案
1,MSCorEE.dll(墊片)
①CLRCreateInstance函數在MSCorEE.dll檔案中實現。“墊片”的工作是決定建立哪個版本的CLR(1.0、2.0、3.0的CLR代碼在MSCorWks.dll檔案中;版本4則在Clr.dll檔案中)
②CLRCreateInstance函數可返回一個ICLRMetaHost介面。宿主應用程式可調用這個介面的GetRuntime函數,指定宿主要建立的CLR版本。然後,墊片將所需版本的CLR載入到宿主的進程中
2,ICLRRuntimeHost可以做以下事情
①設定宿主管理器。該訴CLR宿主想參與與涉及以下操作的決策:記憶體配置、線程調度/同步以及程式集載入等。宿主還可聲明它想獲得有關記憶體回收啟動和停止以及特定操作逾時的通知
②擷取CLR管理器。告訴CLR阻止使用某些類/成員。另外,宿主能分辨哪些代碼可以調試,哪些不可以,以及當特定事件(例如AppDomain卸載、CLR停止或者堆棧移除異常)發生時宿主應調用哪個方法
③初始化並啟動CLR
④載入程式集並執行其中的代碼
⑤停止CLR,阻止任何更多的Managed 程式碼在Windows進程中運行
二、AppDomain
CLR COM伺服器初始化時會建立一個AppDomain。AppDomain是一組程式集的邏輯容器。CLR初始化時建立的第一個AppDomain稱為“預設AppDomain”,這個預設的AppDomain只有在Windows進程終止時才會被銷毀
1,AppDomain的具體功能
①一個AppDomain的代碼不能直接存取另一個AppDomain的代碼建立的對象。
一個AppDomain中的代碼建立了一個對象後,該對象便被該AppDomain“擁有”。換言之,它的生存期不能超過建立它的代碼所有的AppDomain。一個AppDomain中的代碼要訪問另一個AppDomain的對象,只能使用“按引用封送”或者“按值封送”的予以。這就強制建立了清晰的分割和邊界,因為一個AppDomain中的代碼不能直接引用另一個AppDomain中的代碼建立的對象。這種隔離使AppDomain能很容易地從進程中卸載,不會影響其他AppDomain正在啟動並執行代碼
②AppDomain可以卸載
CLR不支援從AppDomain中卸載特定的程式集,但可以告訴CLR卸載一個AppDomain,從而卸載該AppDomain當前包含的所有程式集
③AppDomain可以單獨保護
AppDomain建立後會應用一個許可權集,它決定了想這個AppDomain中啟動並執行程式集授予最大許可權,正是由於存在這樣的許可權,所以當宿主載入一些代碼後,可以保證這些代碼不會破壞(或讀取)宿主本身使用的一些重要資料結構
④AppDomain可以單獨配置
AppDomain建立後會關聯一組配置設定。這些設定主要影響CLR在AppDomain中載入程式集的方式,設計搜尋路徑、版本繫結重新導向、卷影複製以及載入器最佳化
2,Windows進程
中立的AppDomain:
MSCorLib.dll包含了System.Object,System.Int32以及其他所有與.NET Framework密不可分的類型
該Loader堆中的所有類型對象,以及為這些類型定義的JIT編譯產生的所有機器碼,都會由進程中的所有AppDomain共用
該中立的AppDomain不能被卸載,除非終止windows進程
CLR寄宿和AppDomain