技術雜談:C# (C sharp) 在非 Windows 系統的日常 (2018 年版)

PUBLISHED ON MAR 27, 2018
FacebookTwitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    C# 傳統上視為一種 Windows-only 的技術,不過微軟近年來改變策略,讓 C# 等原先僅限於 Windows 的技術走出 Windows 系統,在 Mac 及 GNU/Linux 等系統上也可使用。雖然比起 C# 精神上的雙胞胎 Java 來說,起步稍微晚了點,這樣的發展,的確有助於 C# 程式設計者延續和拓展其技術的生命週期。本文檢視 C# 在非 Windows 系統上的應用。

    註:這類型的資訊會隨時間而改變,我們以西元 2018 年三月左右的狀況為準。

    如果接觸過 .NET 平台的讀者,知道 .NET 平台不是單一的語言,而是有多種語言的共通平台;一般來說,.NET 平台的代表性語言有 C#、F#、Visual Basic。不過,可以看得出來其實 .NET 平台最注重的語言還是 C#,在搭配 .NET 平台的 IDE 上,絕大部分的專案都可用 C# 撰寫,但另外兩種語言能撰寫的專案類型相對少。本文仍然以 C# 為出發點來考慮。

    除了原先在 Windows 上的 .NET Framework 外,C# 有兩個執行環境:

    為什麼會有兩個重覆目標的專案呢?這是一個自然發展的過程。.NET Core 是微軟推出的專案,這個專案比較年輕,目前能開發的項目比較少。而 Mono 是由 Xamarin 所主導的社群專案,原先的目標是在 GNU/Linux 系統上提供 C# 的執行環境,目前主要是用於 GNU/Linux 和 Mac 上。由於微軟收購了 Xamarin,目前兩個專案都是由微軟主導。從長遠來看,兩者若能合併會比較好,不過短期內大概就是兩者並行的狀態。

    在 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 上使用。Rider 是一個相對新穎的選項,由 JetBrains 出産的 IDE,可在多種平台上使用。另外,如果想用其他編輯器,可透過 OmniSharp 專案增強該編輯器對 C# 的支援。

    以軟體的發佈形式來說,常見的有以下數種:

    • 終端機程式 (console application)
    • 圖形介面程式 (GUI application)
    • 網頁程式 (web application)
    • 行動程式 (mobile application)
    • 函式庫 (library)

    函式庫算是軟體人寫給軟體人的開發工具,不算是應用程式,其他四種則算是一般使用者會接觸到的應用程式形態。本文將逐一討論。

    由於現在的個人電腦等級系統都有圖形介面,終端機程式使用者較先前少得多,大概只有一些專業人士 (程式設計師、科學家等) 會去使用終端機程式。雖然 .NET 平台沒有像 Java 平台的 JAR 一般便利的格式,透過一些簡單的包裝,也可以將程式包得很像原生程式 (看這裡)。此外,Mono 和 .NET Core 也可以透過 self-contained deployment 將整個執行環境包進主程式中,但相關資料偏少。

    目前 .NET Core 還無法製作圖形介面程式,而 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 上開發此軟體的想法。

    有些程式共通的邏輯,可以獨立出來,包在函式庫中,在開發不同形態的程式就不用重寫一次。.NET 平台先前是用 PCL (Portable Class Library),最近則改為 .NET Standard Library,目前應該是使用後者較佳。站在程式人的眼光,當然不希望一直改函式庫格式,重點應該是共用程式碼,而不是一直在格式上打轉;現在看起來微軟也是在跨平台的磨合期,希望可以儘早穩定下來。

    隨著微軟的策略調整,C# 逐漸跨出 Windows 舒適圈。目前看起來是 .NET Core 主打網頁程式,Mono 則著重在行動程式,但在非 Windows 平台的圖形程式是相對比較弱勢的一環,微軟還需要再努力一陣子。C# 和 Java 持續競爭,對程式人來說反而是好事,因為有競爭的產品才會持續進步。