程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 不用IDE寫C#的Hello World,

不用IDE寫C#的Hello World,

編輯:C#入門知識

不用IDE寫C#的Hello World,


 用Visual Studio等IDE寫C#的Hello World非常簡單,但脫離了IDE你能不能打印出Hello World呢?這不是說工作時脫離IDE,而是學習一下CLR的執行模型.

  Hello World

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

  CLR執行模型-編譯期

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

image

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

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

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

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

image

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

image

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

  運行期

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

  程序集的可執行代碼在需要的時候由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(博客園不支持txt格式):

image

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

  生成本機代碼

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

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved