前言
C# 傳統上視為一種 Windows-only 的技術,不過微軟近年來改變策略,讓 C# 等原先僅限於 Windows 的技術走出 Windows 系統,在 Mac 及 GNU/Linux 等系統上也可使用。雖然比起 C# 精神上的雙胞胎 Java 來說,起步稍微晚了點,這樣的發展,的確有助於 C# 程式設計者延續和拓展其技術的生命週期。本文檢視 C# 在非 Windows 系統上的應用。
如果接觸過 .NET 平台 (.NET platform) 的讀者,會知道 .NET 平台不是單一的語言,而是有多種語言的共通平台;一般來說,.NET 平台的語言有 C# (C sharp)、F# (F sharp)、Visual Basic 等。不過,可以看得出來其實 .NET 平台最注重的語言還是 C#,在搭配 .NET 平台的 IDE 上,絕大部分的專案都可用 C# 撰寫,但另外兩種語言能撰寫的專案類型相對少。本文仍然以 C# 為出發點來考慮。
一個語言,三個平台
C# 目前有三個執行環境:
- .NET Framework (Windows only)
- .NET Core
- Xamarin/Mono
除了原本在 Windows 上跑的 .NET Framework 以外,為什麼會有兩個重覆目標的專案呢?這是一個自然演進的過程。
.NET Core 是微軟推出的專案,這個專案比較年輕,目前主打的項目以網頁程式及伺服端程式為主。
而 Mono 是由 Xamarin 所主導的社群專案,原先的目標是在 GNU/Linux 系統上提供 C# 的執行環境;本來 Mono 設計來運行各種類型的專案,目前主要是用於行動軟體。
由於微軟收購了 Xamarin,目前兩個專案都是由微軟主導。從長遠來看,這些平台若能合併會比較好,不過短期內大概就是三者並行的狀態。
用來撰寫 .NET 程式的 IDE
在 Windows 上通常會用 Visual Studio 撰寫 C# 專案,如果在非 Windows 系統上有三個選擇:
- Visual Studio for Mac
- MonoDevelop (給 GNU/Linux 使用者使用)
- Rider (跨平台商業軟體)
MonoDevelop 比較早出現,目標是在非 Windows 系統上提供 C# 的 IDE。後來 Xamarin 以 MonoDevelop 為基礎,發展出 Xamarin Studio。微軟收購 Xamarin 後,繼續以 Xamarin Studio 為基礎開發出 Visual Studio for Mac。
在兩者之中,Visual Studio for Mac 能開發的專案比較多元,但僅能在 Mac 上使用;MonoDevelop 則留給 GNU/Linux 系統的使用者來使用。
Rider 是一個相對新穎的選項,由 JetBrains 出産的 IDE,可在多種平台上使用。Rider 可選擇的專案類型會根據不同系統而有差異,基本上就是該平台可寫的專案類型為準。
另外,如果想用其他編輯器,可透過 OmniSharp 專案增強該編輯器對 C# 的支援。
各式各樣的專案
以軟體的發佈形式來說,常見的有以下數種:
- 終端機程式 (console application)
- 圖形介面程式 (GUI application)
- 網頁程式 (web application)
- 行動程式 (mobile application)
- 電腦遊戲 (computer Game)
- 函式庫 (library)
函式庫算是軟體人寫給軟體人的開發工具,不算是應用程式,其他四種則算是一般使用者會接觸到的應用程式形態。
終端機程式
由於現在的個人電腦等級系統都有圖形介面,終端機程式使用者較先前少得多,大概只有一些專業人士 (程式設計師、科學家等) 會去使用終端機程式。雖然 .NET 平台沒有像 Java 平台的 JAR 一般便利的格式,透過一些簡單的包裝,也可以將程式包得很像原生程式 (看這裡)。此外,Mono 和 .NET Core 也可以透過 self-contained deployment 將整個執行環境包進主程式中,但相關資料偏少。
圖形介面程式
目前 .NET Core 可以在 Windows 上製作圖形介面程式,在其他平台上則不行。因為圖形介面基本上還是要呼叫 WinAPI,在其他平台上重製 WinAPI 所耗費的工程太大。
而 Mono 主要有兩種函式庫可選擇:WinForms 和 Gtk#。Mono 上的 WinForms 是從 Windows 上的 WinForms 移植而來,支援到 2.0 版,該專案目前為維護模式,僅修復 bug 但不新增功能。由於 WinForms 會用到 Win32 API,Mono 上的 WinForms 沒有完全移植。
Gtk# 則是 GTK+ 專案的 C# binding,好處是可跨 Windows、GNU/Linux、Mac 等平台,目前 MonoDevelop 預設專案可建置 Gtk# 專案但無法建置 WinForms 專案,看起來 Mono 社群比較推 Gtk#。
網頁程式
微軟的網頁技術有三階段的演進:ASP、ASP.NET、ASP.NET Core,Mono 支援第二種而 .NET Core 支援第三種。ASP.NET 使用 Web Forms 對網頁技術進行進一步封裝,而 ASP.NET Core 貼近原生的網頁技術;目前看起來是兩者並行,但 Web Forms 僅限 Windows 平台上的 .NET Framework 可用,在非 Windows 平台上僅能選擇後者。
行動軟體
跨平台行動程式是 Xamarin 近年來主打的項目,Xamarin.Android 和 Xamarin.iOS 就是兩大手機平台的 Mono 實作品。雖然在 GNU/Linux 上也能寫 Android 手機應用,但 Xamarin 這套工具目前僅在 Windows 和 Mac 上提供;目前 iOS 程式僅能在 Mac 上編譯,可能是 Xamarin 當時僅在 Windows 和 Mac 上開發此軟體的想法。
電腦遊戲
C# 可以用來寫電腦遊戲,大部分都是用 Unity 寫跨平台遊戲。除了 Unity 外,還有其他選擇,像是 MonoGame 等。
函式庫
有些程式共通的邏輯,可以獨立出來,包在函式庫中,在開發不同形態的程式就不用重寫一次。.NET 平台先前是用 PCL (Portable Class Library),最近則改為 .NET Standard Library,目前應該是使用後者較佳。站在程式人的眼光,當然不希望一直改函式庫格式,重點應該是共用程式碼,而不是一直在格式上打轉。
由於 .NET 平台有三個運行環境,為了整合不同環境的 API,微軟推出 .NET Standard。在寫函式庫時,可參考 .NET Standard 的版本,視需求決定要跟到那一個版本。
結語
隨著微軟的策略調整,C# 逐漸跨出 Windows 舒適圈。目前看起來是 .NET Core 主打網頁程式,Mono 則著重在行動程式,但在非 Windows 平台的圖形程式是相對比較弱勢的一環,微軟還需要再努力一陣子。C# 和 Java 持續競爭,對程式人來說反而是好事,因為有競爭的產品才會持續進步。