位元詩人 技術雜談:C# (C sharp) 在非 Windows 系統的日常 (2019 年版)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

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# 目前有三個執行環境:

除了原本在 Windows 上跑的 .NET Framework 以外,為什麼會有兩個重覆目標的專案呢?這是一個自然演進的過程。

.NET Core 是微軟推出的專案,這個專案比較年輕,目前主打的項目以網頁程式及伺服端程式為主。

而 Mono 是由 Xamarin 所主導的社群專案,原先的目標是在 GNU/Linux 系統上提供 C# 的執行環境;本來 Mono 設計來運行各種類型的專案,目前主要是用於行動軟體。

由於微軟收購了 Xamarin,目前兩個專案都是由微軟主導。從長遠來看,這些平台若能合併會比較好,不過短期內大概就是三者並行的狀態。

用來撰寫 .NET 程式的 IDE

在 Windows 上通常會用 Visual Studio 撰寫 C# 專案,如果在非 Windows 系統上有三個選擇:

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 持續競爭,對程式人來說反而是好事,因為有競爭的產品才會持續進步。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。