首頁 > 後端開發 > C#.Net教程 > 不用IDE也能寫出C#的Hello World詳解(圖)

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

黄舟
發布: 2017-03-10 11:24:40
原創
1465 人瀏覽過

用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) 命令提示程式

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

#   3、切換到HelloWorld.txt的目錄

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

#   4、執行指令:csc /out:Hello.exe HelloWorld.txt

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

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

 CLR執行模型-編譯期

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

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

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

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

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

  執行上面兩步驟就可以得到一個XX.dll或XX.exe的組件,就像上面的Hello.exe。

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

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

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

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

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

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

 運行期

  上面產生了程式集,程式集內的是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:

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

#   再次執行指令: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:

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

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

以上是不用IDE也能寫出C#的Hello World詳解(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板