dotNet的體系結構介紹

1、公共語言運行庫git

.NET Framework 的核心是其運行庫執行環境,稱爲Common Language Run,一般在CLR控制下運行的代碼稱爲託管代碼(由GC進行資源管理和回收),還有一部分是非託管代碼包括的文件操做的句柄、對數據庫資源進行訪問的連接和網絡連接,對非託管資源的管理有兩種方法:github

1.聲明一個析構函數,做爲類的成員數據庫

~MyClass()
        {
            //destrutor implementation
        }

2.在類中實現System.IDisposable編程

public void Dispose()
        {
            //implementation
        }

CLR執行編寫好的源代碼,須要編譯源代碼,.NET把編譯分爲兩個階段緩存

(1)將源代碼編譯爲Microsoft的中間語言(IL)網絡

(2)CLR把IL編譯爲平臺專用的代碼函數

IL能夠快速的轉換爲本地機器碼,而且老是即時編譯的JIT,因此有:平臺無關性、提升性能和語言的互操做性。工具

對於平臺無關性:.NET對於Windows的支持已經造成了UWP對Microsoft產品的全面支持、用.Net Core更能夠開發跨平臺的Web應用程序、經過Xamarin中的工具和庫也能夠在移動設備上(iPhone和Andriod)使用C#。性能

對於提升性能:IL老是JIT編譯的,JIT編譯器確切地知道程序運行在什麼類型的處理器上,能夠利用該處理器提供的任何特性或特定的機器碼來優化最後的可執行代碼,目前X64和X86的CPU二者的主要卻別是32位處理器上,須要用4個字節存儲一個地址,而64位處理器上須要用8個字節存儲一個地址。優化

對於語言的互操做性:如今支持.NET交互操做的主要有:VB.Net、Visual C++、Visual F#、COM和COM+、Windows運行庫,Common Type System 通用類型系統和Common Language Specification 公共語言規範一塊兒確保語言語言的互操做性

 

2、進程和應用程序域

在啓動一個新的應用程序時,它會在一個進程環境內運行,Windows經過地址空間把進程分隔開來。這樣,每一個進程有本身的虛擬內存來存儲其數據和可執行代碼,Windows利用額外的間接方式把這些虛擬的內存映射到物理內存或磁盤空間的一個特殊區域中,這樣確保每一個進程相互獨立,例如獲取計算機正在運行的每一個進程列表,當有同名的進程時,把進程結束。

 var processList = Process.GetProcesses().OrderBy(x => x.Id).ThenBy(x => x.ProcessName);
            foreach (var process in processList)
            {
                if (process.ProcessName.Equals("cmd"))
                    process.Kill();
                else
                    Console.WriteLine("Process id is{0},Process name is {1}", process.Id, process.ProcessName);
            }

關閉的進程必定要是本身有權限,不然會報沒法訪問的錯誤。

Process類的詳細信息能夠參考Microsoft官方文檔 http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx

但使用.NET創建的可執行程序 *.exe,並無直接承載到進程當中,而是承載到應用AppDomain當中。應用程序域是.NET引入的一個新概念,它比進程所佔用的資源要少,能夠被看做是一個輕量級的進程。
在一個進程中能夠包含多個應用程序域,一個應用程序域能夠裝載一個可執行程序(*.exe)或者多個程序集(*.dll)。這樣可使應用程序域之間實現深度隔離,即便進程中的某個應用程序域出現錯誤,也不會影響其餘應用程序域的正常運做。

當一個程序集同時被多個應用程序域調用時,會出現兩種狀況:
第一種狀況:CLR分別爲不一樣的應用程序域加載此程序集。
第二種狀況:CLR把此程序集加載到全部的應用程序域以外,並實現程序集共享,此狀況比較特殊,被稱做爲Domain Neutral。

下面一個實列建立一個新的應用程序域,進行應用程序升級操做,當升級完成以後卸載這個應用程序域。

static void Main(string[] args)
        {
            var UpdateDomain = AppDomain.CreateDomain("UpdateMyApp");

            //build the method when load assembly
            UpdateDomain.AssemblyLoad += (obj, e) =>
            {
                Console.WriteLine("Update {0} App...", e.LoadedAssembly.GetName());
            };

            //build the method when unload assembly
            UpdateDomain.DomainUnload += (obj, e) =>
            {
                Console.WriteLine("Update Finish");
            };
            ShowMessage()
var crossAppDomainDelegate = new CrossAppDomainDelegate(ShowMessage); UpdateDomain.ExecuteAssembly(@"D:\Visual Studio項目練習\PraticeCharter01\TestAppDomain\bin\Debug\TestAppDomain.exe"); UpdateDomain.DoCallBack(crossAppDomainDelegate); Console.WriteLine("Thread sleep 2s"); Thread.Sleep(2000); AppDomain.Unload(UpdateDomain); Console.WriteLine("Update Finish"); var a= Console.Read(); } public static void ShowMessage() { Console.WriteLine("Current Thread ID is:{0}\t AppDomain ID is:{1}\t AppDomain Name is:{2}", Thread.CurrentThread.ManagedThreadId, AppDomain.CurrentDomain.Id,AppDomain.CurrentDomain.FriendlyName); }

執行以後的結果是:

能夠看出線程存在於進程當中,它在不一樣的時刻能夠運行於多個不一樣的AppDomain當中。

在另外一個應用程序域中執行代碼詳細信息請參考:https://msdn.microsoft.com/zh-cn/library/ms173139(v=vs.110).aspx也能夠試一下WPF應用程序域中調用另外一個WPF編譯的應用程序。

3、程序集

Assembly是包含編譯好的,面向.Net Framework的代碼邏輯單元,程序集的一個重要特徵是他們包含的元數據描述了對應代碼中定義的類型和方法。程序集也包含描述程序集自己的元數據,這種程序集元數據包含在manifest區域中。

私有程序集通常附帶在某個軟件中,且只能用於該軟件。

共享程序集放在文件系統的一個特定子目錄中,稱未全局程序集緩存GAC

4、.Net在編譯和執行的過程:

本文主要參考C#高級編程第九版,以後會作一個關於本書的專欄,主要是結合本身的理解和編程實際對.NET有一個更深的認識。

專欄編寫計劃:無特殊狀況前面1-31章會,會以每週兩篇的量更新

       31-47章會針對每種技術,以項目實例的方法進行更新,具體更新時間未定

       全部源碼地址:https://github.com/powfulCsharp/C-AdvancedProgramming

時間倉促,可能有些地方寫得不對,但願你們指正

推薦和點贊是對我最好的鼓勵!!!

相關文章
相關標籤/搜索