不用IDE也能寫出C#的Hello World詳解

來源:互聯網
上載者:User
用Visual Studio等IDE寫C#的Hello World非常簡單,但脫離了IDE你能不能列印出Hello World呢?這不是說工作時脫離IDE,而是學習一下CLR的執行模型.

 Hello World

  1、建立一個記事本,輸入如下代碼,另存新檔HelloWorld.txt。

using System;namespace HelloWorld{   class Program   {        static void Main(string[] args) {            Console.WriteLine("Hello World!");            Console.ReadKey();        }    }}

  2、開啟Visual Studio 2008(2005,2010) 命令提示程式

  3、切換到HelloWorld.txt的目錄

  4、運行命令:csc /out:Hello.exe HelloWorld.txt

  如無意外,將會編譯出Hello.exe,能列印出Hello World。

 CLR執行模型-編譯期

  CLR程式的執行過程大致分為兩步,編譯期和運行期,編譯期過程大致如:

  其中編譯期邏輯上也可分為兩步:

  1、CLR(C#)編譯器接受原始碼檔案,並編譯為託管模組。託管模組包括IL代碼、中繼資料、CLR頭等組成部分。上面的例子中就是將HelloWorld.txt編譯成託管模組。

  2、一般程式集都會包含很多原始碼檔案(這裡只有HelloWorld.txt)和資源檔,第二步就是把各個原始碼檔案和資源檔對應編譯結果合并成程式集。

  執行上面兩步就可以得到一個XX.dll或XX.exe的程式集,就像上面的Hello.exe。

  編譯器如何知道要編譯成託管模組還是資源檔?其實是必須明確告訴編譯器每個檔案的怎麼編譯,這個對應Visual Studio的檔案屬性的產生操作.

  右擊任何Visual Studio解決資源方案的檔案-->屬性-->產生操作:

  指定Class1為內嵌資源,用ILSpy查看會發現只是把Class1嵌入到程式集中,名稱為:命名空間.檔案名稱:

  你甚至可以將一張圖片設為編譯讓編譯器試圖去編譯它,不過會報錯。

 運行期

  上面產生了程式集,程式集內的是IL代碼,它還不是可啟動並執行代碼。IL是與CPU無關的機器語言,直到程式集被調用,才會由JIT(Just-in-Time,即時)編譯器編譯為機器碼(CPU指令)。在運行時,CLR執行如下步驟:

  1、檢查程式集的安全特性;

  2、在記憶體中分配空間;

  3、把程式集中的可執行代碼發送給JIT編譯器,把其中一部分編譯成機器碼(CPU指令)。

  程式集的可執行代碼在需要的時候由JIT編譯器編譯,然後機器碼(CPU指令)就被緩衝以備後來的程式中執行。一旦應用程式終止,編譯好的機器碼也會被丟棄。

  例如如果將上面的代碼改為:

static void Main(string[] args) {    Console.WriteLine("Hello");    Console.WriteLine("World!");    Console.ReadKey();}

  第一個WriteLine需要先JIT編譯,再執行。而由於已編譯WriteLine的代碼,所以第二個WriteLine會直接執行記憶體塊中的代碼,跳過JIT編譯。

  由於分配記憶體、JIT編譯過程等,所以程式會在第一次運行時造成一些效能損失,寫ASP.NET時這種感覺特變明顯,按了F5會等很久才會顯示首頁。

  下面類比感受這個過程。用一大堆類延長記憶體配置的時間,參考這個檔案HelloWorld.cs:

  再次運行命令:csc /out:Hello.exe HelloWorld.txt,得到Hello.exe,執行時發現有一定的延遲才會列印出Hello World。

 產生機器碼

  使用.NET提供的NGen.exe,可以將IL代碼編譯成機器碼,可以解決上面的問題。NGen.exe有兩個作用:

  1、加快應用程式的啟動速度。因為代碼已編譯為機器碼,運行時不需要再花時間編譯。

  2、減少應用程式的程式集。如果一個程式集會同時載入多個進程,NGen.exe會將IL編譯成機器碼,並儲存到一個單獨的檔案中。這樣就可以通過"記憶體映射"的方式,同時映射到多個進程中,使代碼共用,避免每個進程一份代碼。

  再次運行 Visual Studio 2008(2005,2010) 命令提示程式

  運行如下命令:ngen install Hello.exe:

  

  命令完成(在我的機器大概要10秒左右,到能再次輸入命令才完成)後,運行Hello.exe會發現馬上就能列印出Hello World,沒有任何延遲。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.