.NET Core CLR 釋出原始碼

在去年年底(2014/11)時,Connect() 2014 研討會上宣佈了 .NET Core 開源的計劃,我也在之前的文章提過這個計劃,當時釋出了 .NET Core 的核心函式庫的原始碼,而今天 .NET team 再釋出 .NET Core CLR 的原始碼,讓整個 .NET Core 開源計劃又再往前進了一大步。

.NET Core 的展望

在原本 .NET 的世界裡,聽到開發人員說:「我這個程式是基於 .NET Framework 4.0 所寫成的。」這句話隱含了這個程式用到了 .NET Framework 4.0 相關的函式庫,所以這個程式必須在 .NET Framework 4.0 的 CLR 上才能執行或是被引用。而這套 .NET Framework 發展至今包山包海,不僅用在桌面應用程式的開發,也在伺服器上的應用程式(如:ASP.NET 等)被廣泛使用,但是發展得太龐大就會衍生出其它的問題,舉例來說,.NET team 要推出在瀏覽器上做一個 client app 的環境,.NET Framework 顯然太龐大了,於是當時就弄出了一個精簡 .NET Framework 的東西叫作 Silverlight,它讓 .NET 開發人員可以繼續使用熟悉的 .NET 程式語言來寫程式,只要選擇 Silverlight 為執行環境,開發工具、.NET 編譯器、IL 組譯器就會幫你弄好可以在 Silverlight 執行環境,而且當時 Silverlight 執行環境還推出了 Windows 及 Mac OS X 的版本,可以算是 .NET 家族跨平台解決方案的前輩(而且後來還以 Silverlight 為基礎發展了 Silverlight for Windows Phone 執行環境,成為許多 Windows Phone app 的基礎)。但這也就變成了每次一有新的目標,就要再另外做一套執行環境,這顯然不是長久之計。

而這波 .NET 開源氣氛下宣佈的 .NET Core,其實是重新思考了核心執行環境、並且達到可以跨平台(不只是跨 Windows 平台,而是可以跨出 Windows 到 Linux、Mac OS X 等)目的、又能兼顧最小核心(類似作業系統中的 micro kernel 概念)等等考量所重新打造的一個新的 .NET 環境,不再讓這個 .NET Core 包山包海,而是維持一個最精簡的執行環境,而應用程式需要的 model、framework 等就與應用程式一起打包,放在 .NET Core 上執行。

當然這樣的改變,變成這些 app 用到的 framework 必須是為 .NET Core 來撰寫,所以不是所有現有的函式庫(尤其是社群或第三方開發)都能在 .NET Core 上運作,這會是一次生態系的大變革。

.NET Core CLR

CLR (Common Language Runtime) 是 .NET 家族的執行環境,不管是用 C#, Visual Basic.net, F#, Iron Python, Iron Ruby 等 .NET 相關程式語言所撰寫的程式,經過 .NET 編譯器編譯後都會產生 IL (intermidiate language) code,最後再由 IL 組譯器(assembler)變成可以在 CLR 上運行的執行檔或函式庫(EXE/DLL)

所以 .NET Core CLR 就是 .NET Core 的執行環境,由於今天釋出了 .NET Core CLR 的原始碼,只要在非 Windows 的環境下將這個原始碼建置起來,基於 .NET Core 寫出來的程式,就可以在各種平台上的 Core CLR 上執行。而現有的 Mono 解決方案雖然也能在非 Windows 平台上執行 .NET 應用程式,只是它目前還是基於完整的 .NET Framework 來實作,而不是 .NET Core。

編譯 .NET Core CLR

目前(撰文的當下)可以在 Windows 以及 Linux(在 Ubuntu Linux 14.10 下測試)成功編譯 .NET Core CLR 的環境:

在 Windows 下編譯

要在 Windows 下編譯 .NET Core CLR,首先要安裝 Visual Studio 2013 以上的版本(可以使用免費的 Community 版),然後安裝 CMake 這個工具,接著使用 GitGitHub for Windows 把 .NET Core CLR 的原始碼抓下來,然後在命令列模式下執行原始碼中的 build.cmd 指令,開始建置 .NET Core CLR。注意:執行 build.cmd 之後會檢查是否有準備好編譯要用的工具,特別是 CMake 的執行檔要在系統路徑中。(預設狀況下是將 C:\Program Files (x86)\CMake\bin 加到 PATH 環境變數中)

開始編譯後就會開始建置

如果安裝的是 Visual Studio 2015 ,可以打開 build.cmd 檔案,把指令碼裡的 VS120COMNTOOLS 都改成 VS140COMNTOOLS 再重新執行即可。

在 Linux 下編譯

在 Linux 下編譯 .NET Core CLR 除了準備編譯工具(clang)之外,也要安裝 CMake 工具,一切準備就緒後,執行原始碼中的 build.sh 指令就可以開始編譯。

 

 

關於建置環境的指南可以參考這篇文章

基於 .NET Core 開發應用程式

現在可以基於 .NET Core 開發的應用程式類型有 ASP.NET 5 以及主控台應用程式(Console app),以 ASP.NET 5 開發為例,如果是使用 Visual Studio 2015 來開發時,在專案上右鍵設定內容,在 KRE Target 設定選擇含有 CoreCLR 字樣的目標環境:

並且在 project.json 檔案中的 "frameworks" 部份只留 "aspnetcore50" 的部份就可以。

至於其它 Console 的應用程式可以參考這個 Github repository 來關注一些 sample code。