在 Linux 和 Mac OS X 系統上執行 .NET

InfoQ - 邵思華發表於2015-05-07

.NET Core 執行時已經看到了實現真正的跨平臺的美好前景,它最終出現在 Linux 和 Mac OS X 平臺上。在上週舉辦的 Microsoft Build 大會上,來自微軟的專案經理 Habib Heydarian 為聽眾分析了這一舉措對開發者們所帶來的益處,並告訴開發者們如何開始探索這些新的機會。在名為“讓 .NET 實現跨平臺”的一場講座中,Heydarian 首先介紹了開發者如何進行一次全新的 .NET Core 安裝。

首先,所有的 .NET 程式碼都包含在一個單獨的資料夾中,而無需將它安裝在某個系統級別的位置。這樣,只要願意,每個 .NET 應用都可以使用一個完全不同的編譯版本。並且在 Windows 系統上進行編譯的程式碼也能夠在 Mac OS X 和 Linux 系統上執行。

要在以上系統中執行一個基於命令列的標準 HelloWorld 程式,可使用以下方式:

./corerun HelloWorld.exe

// corereun 是一個原生的執行 app 的環境

// 在 Windows 上,引導 .NET 應用的功能已經內建於作業系統中了

在非 Windows 平臺上使用 .NET,就意味著開發者們能夠使用 ASP.NET 5、CoreCLR,並且從以下共享的功能中受益了:

  1. 執行時元件
    • 64 位的 JIT 編譯器與 SIMD 指令
    • 垃圾回收器
  2. 類庫
    • 基礎類庫
    • NuGet 包
  3. 編譯器
    • .NET 編譯器平臺(Roslyn)

如何獲取 .NET Core

對於 Mac OS X 開發者來說,推薦的方式是使用 Homebrew 以獲取必要的元件。當安裝好 Homebrew 之後,就可以通過以下命令獲取 .NET 元件了:

brew tap aspnet/dnx
brew update
brew install dnvm
dnx . kestrel

Linux 使用者可以從該專案的網站上下載一個包含了所有必要元件的 TAR 檔案,隨後按照以下方式進行安裝:

tar zxvf PartsUnlimited-demo-app-linux.tar.gz -C ~/
source ~/.dnx/dnvm/dnvm.sh
dnvm use 1.0.0-beta5-11624 -r coreclr -arch x64
dnx . kestrel

你一定注意到了一點,在這個兩個平臺上所執行的最後一條指令都是 kestrel 的執行。Kestrel 也正是“跨平臺的 ASP.NET 5 web 伺服器”,DNVM 則是 .NET 的版本管理器。目前,該專案只支援 64 位平臺的 Linux 和 Mac OS X。開發團隊仍然在繼續研究如何讓它支援 32 位的系統。

緊隨 Linux 和 Mac OS X 之後,對 FreeBSD 的支援最近也加入到該專案中。對於這三個平臺來說,目前還存在著一個限制,那就是從原始碼編譯 .NET Core 的功能僅限於 Windows 版本。要從原始碼編譯 .NET,開發者需要首先編譯 CoreCLR,然後再編譯 CoreFX。

正如 Windows 平臺上的 .NET 開發者能夠利用平臺呼叫(PInvoke)功能一樣,Linux 平臺上的開發者也能夠使用 DLL Import 這一命令:

[DllImport (“libc”)]
private static extern int printf (string format);

Printf (“Hello, //BUILD 2015!\n”);

下一步計劃

Heydarian 在演講餘下的部分談到了該團隊下一步的計劃,以及微軟對這一專案的目標。隨著 Visual Studio 不斷地擴充套件到非 Windows 的平臺上,微軟希望能夠改進在這些新環境中的除錯功能。對於 VS2015 來說,就是要實現遠端除錯。而對於 VS Code 來說,首先要從實現本地除錯開始。

另一個改進的方向是整體的上線預備。為了在這方面有所突破,團隊打算整合 MSBuild 的支援,並消除目前對 Mono 在這方面功能的依賴。

Heydarian 表示,當 .NET 在 Linux 和 Mac OS X 平臺上正式釋出,併成為“RTM”版本之後,微軟將做出以下正式的承諾:

  1. .NET Core 應用能夠在基於 Linux 的生產環境中執行,包括 Docker、本地部署和雲端部署
  2. 開發者可以使用 VS Code 或其它任何喜愛的編輯器,對執行在 Mac OS X 環境中的 .NET 程式碼進行編輯、編譯與除錯
  3. 全部使用無關平臺特性建立的應用在 Windows 與其它平臺上具有相同的行為
  4. .NET Core 將把現有 .NET 雲端生態系統的類庫也帶到 Linux 上
  5. 微軟對 .NET 在 Linux 上的支援、服務和維護與其它微軟產品一視同仁

在你的應用中加入對 Linux 和 Mac OS X 的支援

微軟將推出一套 API 可移植性工具,用於對現有的程式碼進行分析,找出所需的程式集和目標平臺。目前為止,唯一對相容性進行了測試的 Linux 分發平臺是 Ubuntu 14.04.2 LTS。雖然沒有明確地表示不支援其它的 Linux 分發平臺,但無法保證在這些平臺上是否能夠正常執行。

Heydarian 認為目前來看,微軟所提供的 .NET 與 Mono 版本相比,所針對的市場方向並不相同。Haydarian 表示:“……雖然[Mono]在移動場合的表現優秀,但它並不是為伺服器或雲端生產環境的使用場景而設計的……”,而 .NET Core 傾向於在具有高吞吐量、高伸縮性,以及更高的修復前平均時間(MTTF)的伺服器環境中所使用。

希望通過 .NET 即將提供的功能,從跨平臺方式中受益的開發者可以首先從 VS2015RC 中的 ASP.NET 5 專案模板開始打造及測試應用,並且參考 GitHub 上的 ASP.NET 示例應用 Parts Unlimited。凡是能夠在 Windows 上的 ASP.NET 5 中成功執行的應用,一旦等到 .NET Core RTM 之後,就能夠無縫地遷移至 Linux 平臺上。

相關文章