.NET程序運行原理及基本概念詳解


一、引言

我們知道在Java中有虛擬機,代碼運行時虛擬機把Java語言編譯成與機器無關的字節碼,然后再把字節碼編譯成機器指令執行,那么在.NET中程序是如何運行的呢?

其實運行原理是一樣的,.NET中的虛擬機是CLR(公共語言運行時),無論是C#程序還是VB程序,首先會由CLR編譯成與平台無關的中間語言IL,然后由公共語言運行時CLR的

即時編譯器JIT編譯成機器代碼,再由CPU去執行它。所以說.NET程序也是需要二次編譯才能運行,其中涉及的相關術語解釋如下:

  1. IL/MSIL (Microsoft Intermediate Language) :微軟中間語言 ,IL是MSIL的縮寫,譯為中間語言,.NET程序下的所有語言都會編譯成中間語言,所以他們之間可以相互調用,與語言無關;
  2. CTS (Common Type System):通用的數據類型系統,比如C#調用VS語言程序,雖然他們各自的數據類型定義不一樣,但是最終都會轉化為通用類型,比如c#中的int,VB語言中的integer,在CLS中都會轉化為System.int32,所以這兩者之間的程序可以相互調用;
  3. CLS(Common Language Specification):公共語言規范;
  4. CLR (Common Language Runtime):公共語言運行時,也有的叫公共語言運行庫;
  5. JIT (Just in time):即時編譯器。

二、控制台程序項目結構解釋

 為了更好的分析.NET程序的運行原理,首先我們在VS2019中新建一個控制台應用程序,名稱為:MyFirstAPP,成功后,我們可以看到系統為我們創建了以下結構:

 這些文件結構的基本含義為:

(1)Properties文件夾:(屬性文件夾)

AssemblyInfo.cs文件:這個主要保存程序發布后的版權信息,我們點擊   屬性=》 程序集信息 可以相關信息。

 (2)引用:這是我們可以添加其他應用程序集,比如系統類庫、其他項目或者模塊的類庫,Webservice服務等

 (3)Program.cs 文件: 這個是項目自定義的代碼類,打開以后,我們看到如下代碼:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace MyFirstApp
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             Console.WriteLine("HelloWorld!");
14         }
15     }
16 }

我們大概分析一下系統默認生成的這些代碼:

  1. using表示引用命名空間:如果我們需要引用其他類庫的中代碼,需要添加引用,相當於Java中的import,如果不使用using引入命名空間,那么我們使用類的時候,就需要通過“命名空間.類名”方式使用;
  2. namespace表示聲明命名空間:命名空間是用來組織和重用知代碼的,我們所有的類必須要歸到指定的命名空間中。
  3. class表示聲明類:命名空間中包括類,類是.net程序基本運行單元。
  4. static void Main(string[] args):表示聲明一個靜態方法,方法名稱為Main,args表示命令參數,這個方式不能修改,否則程序將不能啟動,因為這是整個程序的入口點。

三、.NET項目編譯

我們點擊編譯,然后打開項目文件夾,在  bin\Debug  下發現系統生成了三個文件,這三個文件的含義如下:

 

  1. exe文件:編譯后生成的可執行文件,里面是MSIL中間語言。項目發布或給用戶可以直接運行的程序;
  2. dll文件:編譯后生成的動態鏈接庫文件。里面也是MSIL中間語言;
  3. pdb文件:包含了編譯后程序指向源代碼的位置信息,用於調試的時候定位源碼,方便調試;

我們把MyFirstApp.dll文件通過ildasm中間語言工具打開,可以看到這個程序的整個結構如下:

 然后雙擊main函數,可以看到該函數的中間語言表示如下:

四、運行過程

        第一步:我們上面的程序在編譯的時候,.NET會生成不依賴於操作系統和特定的CPU的中間語言,而中間語言

是可以在各個操作系統上都能編譯的代碼,這種代碼Java里面叫做ByteCode(字節碼),.NET

里面我們稱之為MSIL指令(微軟中間語言)這是程序編譯的第一步。


        第二步:不管是Java的字節碼還是.NET的MSIL指令是不能直接運行的,因為機器只能識別用0和1表示的機器語言

所以CLR里面的JIT需要將上面的MSIL在一次編譯成CPU能夠執行的機器指令,最終由電腦執行。整個過程如下圖所示:

五、總結

         以上是本次分享的內容,有些地方可能不一定正確,歡迎大家批評指正

微信名片

作者 高紅斌
聯系QQ 2358643757
出處 https://www.cnblogs.com/gaohongbin
本文版權歸作者和博客園共有,如需全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文鏈接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM