.NET 使用 .NET Core 跨平臺執行

發表於2016-04-28

我們正在 Microsoft 中構建全新的.NET 實現(稱之為 .NET Core),可讓您針對雲優化的工作負載編寫跨平臺程式碼。很多人對這一開源開發很感興趣,但它的實際意義是什麼呢? 本文應可幫助闡明 .NET Core 的意義及其目標,其與 Microsoft .NET Framework 的關聯,以及您可以用於 .NET Core 入門的命令列工具基礎。

什麼是 .NET Core?

要理解 .NET Core 的含義,我們有必要先理解 .NET 本身。很多人在提到“.NET”時是指“.NET Framework”,但“.NET”的含義遠不止如此。.NET 是具有多種實現(.NET Framework、Mono、Unity 和現在的 .NET Core)的 ECMA 標準。這意味著多種體驗都在 .NET Framework 和 .NET Core 之間共享。但是,.NET Core 是全新的,有一些令人印象深刻的不同原則。

首先,.NET Core 是跨平臺的。它可在 Windows、OS X 和 Linux 的多個釋出版本上執行。它還支援不同的 CPU 體系結構。我們正在新增更多的 Linux 釋出版本和 CPU 體系結構支援,最終目的是使 .NET Core 在儘可能多的環境中執行。

同時,.NET Core 在設計和體系結構上基本是模組化的。它的執行時、庫和編譯器元件均為獨立的實體,並通過設計良好的介面進行通訊。這可以讓您針對特定需求“換入”和“換出”元件。庫本身也是模組化的,並通過 NuGet 分佈,這樣,您就可以只使用需要的內容,以在任意給定系統上優化 .NET Core 的佔用。

另外,針對 .NET Core 編寫的程式碼是可移植的,並可被調整為在所支援的不同平臺間執行。根據您決定專案目標的方式,.NET Core 程式碼可能會在 .NET Framework、Mono 和 Xamarin 平臺、Windows 8 和 Windows Phone 以及通用 Windows 平臺 (UWP) 上執行。要了解更多資訊,請檢視 .NET 平臺標準 (bit.ly/1Of6W1r)。

最後,.NET Core 會成為“付費”的高效能實現。.NET Core 的目標之一在於,通過實現付費模式,清楚地表示出採用更高階別的抽象解決問題而產生的費用,使開發人員明確抽象成本。抽象並不是免費使用的,而且,決不應該對開發人員隱藏這一事實。另外,.NET Core 可使用標準庫提升效能,標準庫可最大程度地降低系統中的分配和總體記憶體佔用。

.NET Core 方案

現在有四種方案,您可以在其中編寫針對 .NET Core 的程式碼:跨平臺 ASP.NET Web 應用、跨平臺控制檯應用、跨平臺庫和框架、UWP 應用

ASP.NET Core 1.0 是用於 .NET Core 的跨平臺 Web 堆疊,採用高速設計。如果您曾經想進行將 ASP.NET Web 應用部署到 Linux 容器上之類的操作,現在您可以做到了。要了解更多有關 ASP.NET Core 提供的多種功能的資訊,請前往 bit.ly/1TqPcIo 檢視文件。

跨平臺控制檯應用的範圍比很多開發人員所預期的要大很多。例如,就本質而言,ASP.NET Core Web 應用是讀取資訊並將資訊寫入埠的控制檯應用—它只是恰好能進行許多其他操作。一套形成整個系統後端的微服務均可被編寫為控制檯應用。

跨平臺庫和框架之間的區別之一在於其規模。庫是在 .NET Core 上構建功能的最自然的候選物件之一。但是在更大的範圍上,用於分散式計算的框架也是極佳的候選物件。

最後,以 Windows 10 裝置系列為目標的 UWP 應用可在 .NET Core 上執行。您可以構建包含了 .NET Core 庫的功能完善的 UWP 應用,以幫助構建豐富的 Windows 10 應用。

換句話說,現在您可以針對 .NET Core 編寫多種內容。隨著工具的成熟和擴充套件,將來,您還可以構建更多內容。

如果您的 .NET Framework 資產屬於這四種方案中的一種,或您想嘗試部分新技術,請轉到bit.ly/1Q1Q18q,您可以在這裡編寫部分 .NET Core 程式碼。

.NET Core 與 .NET Framework 的比較結果

大部分人瞭解並喜愛的 .NET 被稱作 .NET Framework。那麼,.NET Core 與 .NET Framework 的比較結果如何呢? 首先請記住,您仍然使用相同的語言(C#、F#、Visual Basic)編寫所有程式碼。從視覺和感覺上來說,您編寫程式碼的體驗應該非常相似。但是,.NET Core 是新的堆疊,而非 .NET Framework 的子集。最好將 .NET Core 和 .NET Framework 看作兩個重合且共同進化的堆疊。

編寫用於 Windows 7 到 Windows 10 的桌面應用程式時,現在和將來使用的都是 .NET Framework 堆疊。事實上,您可以讓 .NET Framework 和 .NET Core 程式碼在同一解決方案中和諧共存。例如,請考慮一個方案,其中,.NET Framework GUI(例如 Windows 窗體)使用的是在 .NET Core 上編寫的服務。

我們可以從兩個方面來看待 .NET Core 和 .NET Framework 之間的異同。 API 外圍應用和執行時功能。圖 1 說明了兩個平臺之間的 API 重疊。

.NET Framework 和 .NET Core 共享一個 API 子集
圖 1:.NET Framework 和 .NET Core 共享一個 API 子集

.NET Core 和 .NET Framework 上均實現了 .NET API(雖然有時底層的實現不同)。同時,.NET Core 和 .NET Framework 均有對方不具備的 API 和功能。例如,.NET Framework 有多個 .NET Core 不具備的 GUI 框架和特定於 Windows 的 API。同樣地,.NET Core 有 .NET Framework 缺少的跨平臺功能和 API。

另外,.NET Framework 是通過 Windows 更新獲得服務的 Windows 元件。而 .NET Core 的存在環境和服務獲取方式則採用完全不同的模式。.NET Core 包括 NuGet 包,並帶有安裝了執行時的本地應用。這就意味著應用程式可以“攜帶”.NET Core,這讓它們可以在計算機或裝置上與其他 .NET Core 例項並行存在。這樣,服務就可以通過程式包管理器應用於每個應用程式,而無需通過 OS 更新全域性應用。

下面提一個實際的問題: 如果您在一個堆疊上編寫程式碼,它會在別的堆疊上執行嗎? 和生活中的大部分問題一樣,這要視情況而定。如果您使用的 API 在兩個平臺上均得以實現,那麼,您執行較少的工作就能在 .NET Core 和 .NET Framework 上執行您的程式碼了。但是,如果您在執行環境中假定了依賴項,或使用了不適用於其中一個堆疊的 API(例如,用於使用基於 XAML 的 UI 的庫),則您的程式碼將不會在兩個堆疊上執行。.NET Portability Analyzer—可用作命令列工具 (bit.ly/1Sd8oIK) 或 Visual Studio 擴充套件 (bit.ly/1LqX0aF)—這是一個工具,用於分析您的 .dll 檔案,並就如何將您的程式碼從 .NET Framework 移植到 .NET Core 生成報告。以後,我們將釋出更多幫助移植的工具。

命令列: 您的 .NET Core 入口點

.NET Core 帶有全新和改進的基礎工具集,可用於開發應用程式。該工具集被稱為 .NET Core CLI,即 .NET Core 命令列介面的縮寫。與 .NET Core 的其他部分相同,它也是開源的(請參閱GitHub.com/dotnet/cli),並具有一個與其開發緊密相關的充滿活力的開源社群。

引入新的工具集有多個原因。首先,我們有必要在 .NET Core 支援的所有平臺上支援核心開發方案。考慮到不同的平臺,良好的命令列體驗是一個可供我們構建的絕佳的基礎;畢竟,命令列是每個平臺預設的自帶內容。

作為邏輯擴充套件,我們希望在支援的各平臺上支援相同的 UX。您可以在 Linux、Windows 和 OS X 之間轉移,而無需重新學習它們的工具、語法或語義。所有平臺上的這些內容都是相同的。使用模式甚至語法都是相同的。

您可以跨平臺使用一個工具集的想法還擴充套件到了更高階別的工具,即 Visual Studio Code 和 Visual Studio。這些更高階別的工具將會在 .NET CLI 上分層,並用它們支援 .NET Core 專案的發展。這就意味著,當您通過 Visual Studio 構建 .NET Core 應用程式時,.NET CLI 工具將被呼叫於執行這一構建。

嘗試 .NET Core 命令列介面

最簡單的 .NET Core CLI 入門方式就是遵循入門指南 (aka.ms/dotnetcoregs)。簡言之,就是下載適用於平臺的安裝程式(如果使用 Ubuntu,則註冊一個新的 apt-get 源)並安裝工具,這樣就準備就緒了。安裝程式會負責在所有支援的 OS 的系統路徑上設定好安裝資料夾,以及 CLI 需要的其他任何環境變數。

之後,您可以通過呼叫“dotnet”驅動程式並傳遞命令(我們也稱之為“謂詞”)進行啟動。驅動程式負責執行命令並向其傳遞所有引數。在本次編寫過程中,CLI 包會帶有圖 2 中的命令。當然,當您讀取這一命令時,我們可能會新增更多提升生產效率的命令。

圖 2:您可以立即使用的部分通用 .NET CLI 命令

命令 說明
dotnet new 使用 C# 語言初始化用於類庫或控制檯應用程式的有效專案。
dotnet restore 還原在指定專案的 project.json 檔案中定義的依賴項。依賴項通常是您在應用程式中使用的 NuGet 包。
dotnet build 生成您的程式碼! 此命令將生成適用於您的專案的中間語言 (IL) 二進位制。如果專案是控制檯應用程式,則產生的輸出是可執行的,您可以立即執行。預設情況下,生成命令會將生成的程式集和可執行檔案(如果適用)輸出到呼叫位置目錄的 bin 目錄中。
dotnet test 如果不支援執行測試,則不會出現適合的工具。此命令讓您可以使用在 project.json 檔案中指定的執行程式執行一組測試。目前支援 xUnit 和 NUnit 測試執行程式。
dotnet publish 釋出在目標計算機上執行的應用程式。
dotnet pack pack 命令會把您的專案打包成 NuGet 包。輸出一組 nupkg 檔案後,您可以將其上載至您的源,或使用本地資料夾替代將其用於還原操作。
dotnet run 執行命令將編譯並執行您的應用程式。您可以將其看作沒有 Visual Studio 的 Ctrl+F5 模擬。

除帶有包的命令外,您還具有將其他命令新增為 project.json 中的工具並將其還原的選項。它們被打包為 NuGet 包,可提供適合且易用使用和理解的擴充套件性模型。

總結

希望您已經瞭解了 .NET Core 的相關知識,並樂於編寫可以跨平臺執行的 .NET 程式碼。作為一個新的堆疊,它會提供一些令人興奮的功能,這在之前的 .NET Framework 上是不可能具備的。.NET CLI 還引入了絕佳的命令列體驗,這將成為開發人員體驗的基礎,並可整合入 Visual Studio 和 Visual Studio Code 等其他工具。

最後,我們瞭解您有多種針對 .NET Framework 編寫的資產,我們很樂於看到這些資產隨著 .NET Framework 的演變不斷髮展。設想一個這樣的世界:在一個系統中一起使用 .NET Framework 和 .NET Core,並利用兩個堆疊的優勢。

如果您想了解更多並參與其中,您可以從以下網站開始:

我們還有很多其他正在開發的 .NET 開源專案。如果您想看到更多內容,請檢視 .NET Foundation,這是一個促進 .NET 開源開發和合作的獨立組織。Microsoft 已經為 .NET Foundation 以及其他公司(例如 Xamarin、Umbraco、Salesforce 和 .NET 社群)貢獻了多個專案。瞭解專案的詳細內容及其貢獻,請前往 DotNetFoundation.org/projects

相關文章