簡(jiǎn)單的說(shuō),進(jìn)程可以承載一組相關(guān)的.NET程序集,而應用程序域(簡(jiǎn)稱(chēng)AppDomain)是對該進(jìn)程的邏輯細分。一個(gè)應用程序域進(jìn)一步被細分成多個(gè)上下文邊界,這些邊界用來(lái)分組目的相似的.NET對象。使用上下文的概念,CLR便能夠確保恰當地控制那些帶特殊運行時(shí)要求的對象。
傳統的進(jìn)程
用來(lái)描述一組資源和程序運行所必需的內存分配。對于每個(gè)被加載到內存的可執行程序,在她的生命周期中操作系統會(huì )為之單獨且隔離的進(jìn)程。由于一個(gè)進(jìn)程的失敗不會(huì )影響其他的進(jìn)程,使用這種方式,運行庫環(huán)境將更加穩定。
通過(guò)任務(wù)管理器,我們可以查看機器上正在運行進(jìn)程的統計信息:進(jìn)程的標示符(PID)以及映像名稱(chēng)。 線(xiàn)程概述 線(xiàn)程是進(jìn)程中的基本執行單元(a path of execution)。進(jìn)程的入口點(diǎn)創(chuàng )建的第一個(gè)線(xiàn)程為主線(xiàn)程。僅僅包含一個(gè)主線(xiàn)程的進(jìn)程是線(xiàn)程安全的。但是,單線(xiàn)程的應用程序用戶(hù)響應不好。 開(kāi)發(fā)者使用多線(xiàn)程,有助于改善程序的總體響應。Win32 API可以讓主線(xiàn)程使用如CreateThread()之類(lèi)的函數,另外產(chǎn)生次線(xiàn)程。每個(gè)線(xiàn)程都是進(jìn)程中的一個(gè)獨立執行單元(unique of execution)。比如:一個(gè)應用程序可以產(chǎn)生一個(gè)工作線(xiàn)程來(lái)執行強度大的工作(比如傳輸大文件),當這個(gè)次線(xiàn)程正在忙碌的時(shí)候,主線(xiàn)程仍然可以對用戶(hù)的輸入保持響應。 當然,如果單個(gè)進(jìn)程中的線(xiàn)程過(guò)多的話(huà),性能反而會(huì )下降,因為CPU需要花不少時(shí)間在這些活動(dòng)線(xiàn)程的來(lái)回切換上。另外,單CPU的計算機并沒(méi)有能力同一時(shí)間運行多個(gè)線(xiàn)程。當一個(gè)縣城的時(shí)間片用完的時(shí)候,他會(huì )被掛起(suspended),以便執行其他的線(xiàn)程。(找詳細點(diǎn)的資料) 如果覺(jué)得太復雜,那么只需要記?。?/span>線(xiàn)程是Win32進(jìn)程的獨立執行的單元,每一個(gè)進(jìn)程都有一個(gè)主線(xiàn)程,并且每個(gè)進(jìn)程還可以以編程的方式創(chuàng )建額外的線(xiàn)程。更多內容可以參考:關(guān)于進(jìn)程和線(xiàn)程『整理』 、復習功課:對進(jìn)程、線(xiàn)程、應用程序域的理解 .NET平臺下與進(jìn)程進(jìn)行交互 .NET的基類(lèi)庫可以方便的和進(jìn)程進(jìn)行交互。他們位于System.Diagnostics命名空間中,該空間定義了許多的類(lèi)型,允許我們與系統進(jìn)程、事件日志和性能計數器進(jìn)行交互。 詳細的關(guān)于Process使用方法可以查閱MSDN,比如獲取/設置進(jìn)程優(yōu)先級,獲取進(jìn)程打開(kāi)的句柄數。 .NET應用程序域 .NET平臺下,程序集并沒(méi)有直接加載進(jìn)進(jìn)程中(傳統的Win32程序是直接承載的)。.NET可執行程序承載在進(jìn)程的一個(gè)邏輯分區中,術(shù)語(yǔ)稱(chēng)應用程序域(簡(jiǎn)稱(chēng)AppDomain)。一個(gè)進(jìn)程可以擁有多個(gè)應用程序域,應用程序域的全部目的就是提供隔離性,相比較與傳統的: 1.應用程序域是.NET平臺操作系統獨立性的關(guān)鍵特性。這種邏輯分區將不同操作系統表現加載可執行程序的差異抽象化了。 2.和一個(gè)完整的進(jìn)程相比,應用程序域的CPU和內存占用要小的多。 3.應用程序域為承載的應用程序提供了深度的隔離。一個(gè)失敗,其他不會(huì )失敗。 單個(gè)進(jìn)程可以承載多個(gè)應用程序域,每個(gè)程序域都和該進(jìn)程的其他程序域隔離開(kāi)來(lái),無(wú)法相互訪(fǎng)問(wèn)。在線(xiàn)程啟動(dòng)的時(shí)候,CLR將自動(dòng)創(chuàng )建這個(gè)特定的應用程序域(默認應用程序域)。然后根據需要創(chuàng )建其他程序域。 兩邊都有mscorlib.dll,因為所有關(guān)鍵程序集會(huì )被CLR自動(dòng)加載到每一個(gè)應用程序域中。 更多內容:C#強化系列文章六:應用程序域(AppDomain)淺析 、寄宿(host)和應用程序域(appdomain) 對象上下文 應用程序域是承載.NET程序集的進(jìn)程的邏輯分區。與此相似,應用程序域也可以進(jìn)一步被劃分為多個(gè)上下文邊界(context boundary)。事實(shí)上,.NET上下文為單獨的應用程序域提供了一種方式,該方式能為一個(gè)給定對象建立“特定的家”(specific home)。 使用上下文,CLR可以確保在運行時(shí)有特殊需求的對象,可以通過(guò)攔截進(jìn)出上下文的方法調用,得到適當的和一致的處理。這個(gè)攔截層允許CLR調整當前的方法調用,以便滿(mǎn)足給定上下文的設定要求。比如,如果定義一個(gè)C#類(lèi)型需要自動(dòng)線(xiàn)程安全(使用【Synchronization】特性),CLR將會(huì )在分配期間創(chuàng )建“上下文同步”。 和一個(gè)進(jìn)程定義了默認的應用程序域一樣,每一個(gè)應用程序域都有一個(gè)默認的上下文(context 0)。大多數.NET對象都會(huì )被加載到上下文0中。如果CLR判斷一個(gè)新創(chuàng )建的對象有特殊需求,一個(gè)新的上下文邊界將會(huì )在承載它的應用程序域中被創(chuàng )建。 可以通過(guò)Thread.CurrentContext獲得上下文,通過(guò)context的ContextProperties屬性獲得描述。 1.一個(gè).NET進(jìn)程可以承載多個(gè)應用程序域。每一個(gè)應用程序域可以承載多個(gè)相關(guān)的.NET程序集,并且可以由CLR(或者AppDomain)獨立地加載或卸載應用程序域。 2.一個(gè)給定的應用程序域中包含一個(gè)或多個(gè)上下文。使用上下文,CLR能夠將“由特殊需求的”對象放置到一個(gè)邏輯容器中,確保該對象的運行時(shí)需求能夠被滿(mǎn)足。 程序集 一個(gè).NET應用程序可以由多個(gè)程序集拼裝而成的。程序集,簡(jiǎn)單來(lái)說(shuō),就是一個(gè)以公共語(yǔ)言運行庫(CLR)為宿主的、版本化的、自描述的二進(jìn)制文件。盡管顯示中.NET程序集和以往Win32二進(jìn)制文件(包括遺留的COM服務(wù)對象)的文件擴展名(*.exe或*.dll)完全相同,但是兩者的內部構成幾乎完全不同。 程序集可以促進(jìn)代碼重用、確定類(lèi)型邊界、可版本化的單元、自描述的、可配置的。 .NET程序集的格式 n Win32文件首部 Win32文件首部使程序集可以被Windows系列操作系統加載和操作。使用dumpbin.exe結合/headers標記打開(kāi)一個(gè).NET程序集,可以瀏覽該程序集的Win32文件首部信息。 n CLR文件首部 為了駐留于CLR中,所有的.NET文件都必須還有CLR首部數據塊。它定義了多個(gè)標記,它們使得運行庫可以了解到托管文件的布局。例如,文件中元數據和資源的位置、程序集構建的運行庫版本、公鑰值等。使用dumpbin.exe結合/clrheader。 n CIL代碼 程序集的核心部分包含CIL代碼,這些CIL代碼是獨立于平臺和CPU的中間語(yǔ)言。運行時(shí),程序集內部的CIL代碼才被編譯成特定平臺和CPU的指令。 n 類(lèi)型元數據 元數據完整的描述了程序集內含另行和引用外部類(lèi)型的格式。 n 程序集清單 詳細記錄了程序集中的每一個(gè)模塊,構建程序集的版本以及該程序集引用的所有外部程序集。 n 可選的嵌入資源 單文件程序集和多文件程序集 程序集由多個(gè)模塊組成。大多數情況下,程序集只由一個(gè)模塊組成。這種情況下,(邏輯)程序集和實(shí)際的(物理)二進(jìn)制文件是一一對應的(因此被稱(chēng)為單文件程序集)。多文件程序集市一個(gè).NET*.dll的集合,這些DLL作為單個(gè)邏輯單元進(jìn)行部署和版本化。通常,其中一個(gè)會(huì )作為主模塊,它將包含程序集級別的清單。主模塊的清單記錄了它依賴(lài)的每一個(gè)*.dll文件 私有程序集 私有程序集要求放置在客戶(hù)端應用程序所有在目錄(應用程序目錄)或者子目錄下。 探測過(guò)程 .NET運行環(huán)境使用一種叫探測(probing)的技術(shù)解析私有程序集的位置(這項技術(shù)并沒(méi)有這個(gè)名字聽(tīng)起來(lái)那樣具有侵略性)。 共享程序集 一個(gè)共享程序集不在部署使用它的應用程序目錄中,它安裝在GAC。GAC是Windows下名為Assembly的目錄。 強名稱(chēng) 在部署程序集到GAC之前,必須賦予它一個(gè)強名稱(chēng),用于標示給定.NET二進(jìn)制文件的發(fā)行者。它的作用就好比全局唯一標示符(GUID)在COM中的作用。它由一組相關(guān)數據組成: n 程序集的有好名稱(chēng)(程序集名減去文件擴展名) n 程序集的版本號(使用[AssemblyVersion]特性賦值) n 公鑰值(使用[AssemblyKeyFile]特性賦值) n 用于本地化得可選的區域性標識(使用[AssemblyCulture]特性賦值) n 嵌入的數字簽名,使用基于程序集內容的散列值和私鑰值生成。







// 得到上下文并輸出ID
Context ctx = Thread.CurrentContext;
Console.WriteLine("{0} object in context {1}",
this.ToString(), ctx.ContextID);
foreach (IContextProperty itfCtxProp in ctx.ContextProperties)
Console.WriteLine("-> Ctx Prop: {0}", itfCtxProp.Name);




聯(lián)系客服