文章出處

微軟在開發ASP.NET 5(當時被稱為ASP.NET vNext)是采用的代號為Project K,所以運行時被稱為KRuntime。KRuntime是一個SDK,它包含了編譯和運行應用程序的所有資源。接下來我們通過三個Hello World實例來演示如何利用KRuntime讓我們編寫的應用運行起來。這三個實例如此的簡單,以至于我們根本不需要利用IDE(Visual Studio 2015)來編寫,我們甚至無需安裝VS 2015。

作為第一個Hello World應用,我們會編寫一個包含入口點(Entry Point)的程序,并通過執行KRuntime的K.cmd命令來啟動它。我們先創建一個空的目錄并將其命名為“HelloWorld”,我們接下來創建的三個應用都保存在這里。接下來我們創建一個名稱為“Project1”的子目錄,它代碼了作為第一個Hello World程序的項目,所有相關的源文件都保存在這里。我們直接在Project1目錄下創建一個文本文件,并將其命名為“Program.cs”。我們直接利用NotePad來編寫這個Program類。如下所示的是這個類型的定義,我們可以看到這個類型中包含了唯一的作為入口點的Main方法(可以定義成實例方法或者靜態方法)。

using System;

namespace Project1
{
  public class Program
  {
     public void Main()
     {
        Console.WriteLine("Hello World!");
     }
  }
}

KRuntime眼中的項目是一個目錄,能夠成為項目的目錄必須具有一個名稱為“project.json”的文件。這是一個采用JSON格式的文本文件,與當前項目編譯/運行相關的配置均定義與此。換句話說,我們熟悉不過的web.config在ASP.NET 5項目已經不再需要了,而project.json不僅僅是web.config的替代者,更多的配置信息被放置在這里。我們在Project1目錄下添加這樣的project.json文件。由于我們的應用是如此簡單,我們不需要在此定義任何配置,所以我們將內容定義為“{}”。

到目前為止,我們第一個Hello World就定義好了,現在我們可以執行KRuntime提供的K.cmd以命令行的方式啟動它。KRuntime的核心是KRE(KRuntime Enviroment),不僅多個版本的KRE可以在同一臺機器上并存,同一個應用程序可以采用不同版本的KRE來運行。KRE的安裝、升級和相關設置(比如設置默認的KRE)通過KVM(K Version Manager)來完成。我們可以執行如下命令來下載和執行相應的腳本來安裝KVM(KVM的安裝時針對當前用戶的,所以需要當前用戶具有Admin權限)。

@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/master/kvminstall.ps1'))"

成功安裝KVM后,在%USERPROFILE%目錄(默認為“C:\Users\{UserName}”)下會創建一個名為.kre的子目錄,命令文件“kvm.cmd”被拷貝到其下的“\bin”目錄下。接下來我們以如下的方式執行這個命令并采用upgrade參數來安裝新的KRE或者將對現有的KRE進行升級。

kvm upgrade

在確保KRE已經安裝在你機器上之后,我們啟動Visual Studio 2015(目前為Preview版本)的命令行工具“Developer Command Prompt for VS 2014”(照理說應該命名為“Developer Command Prompt for VS 2015” 在VS 2015 Preview版本中確實是“2014”)或者直接使用CMD命令行。在將Project1目錄作為當前目錄(執行CD命令)后執行按照如下的形式執行K run命令之后(我將HelloWorld目錄保存在C:\下),我們的程序被成功執行。

01

我們在通過執行K run命名啟動程序之前并沒有執行任何編譯操作,所以K run會自動幫助我們對目標項目進行編譯。實際上這是一個動態編譯的過程,具體的編譯是 通過一個名叫Roslyn的編譯器完成的。具體來說,編譯器會將當前目錄(%CD%)作為目標項目的根目錄,根據project.json的設置來選擇相應的源文件進行編譯。對于我們的程序來說,我們不曾在project.json中定義任何配置,所以目錄下的.cs文件(Program.cs)會默認作為源文件編譯到生成的程序集中(程序集會以項目的根目錄進行命名,所以編譯生成的目標程序集名稱為Project1.dll)。

成功編譯之后,目標程序集中的以Program命名的類型被解析出來,定義其中的Main方法將會作為入口程序被執行。具體來說,如果這是一個靜態方法,該方法會被直接執行;如果這是一個實例方法,一個Program對象被創建出來,它的Main方法隨之被執行。關于程序入口的解析,有一點值得提醒一下:一般來說定義在啟動程序中唯一的靜態Main方法會默認作為入口點,但是只有定義在Program類中的Main方法才會被視為合法的入口點。除此之外,K.cmd并不要求Main方法是靜態的。它也并不要求Program類具有無參構造函數,因為在實例化Program對象的時候,內置的DI容器能夠自動提供相應的參數。

對于上面創建的這個Hello World應用來說,程序入口點由應用自身來提供,所以應用本身具有自我執行的能力。從應用托管(Host)的角度來講,這樣的應用同時負責對自身的托管。將應用與托管環境獨立起來其實是更好的選擇,因為這樣可以使同一個應用運行于不同的環境中。在下一篇中我們就來演示如何為應用指定入口程序來達到應用與應用托管的分離

通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(1)
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(2)
通過3個Hello World應用來了解ASP.NET 5應用是如何運行的(3)


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()