技术杂谈:C# (C sharp) 在非 Windows 系统的日常 (2018 年版)

PUBLISHED ON MAR 27, 2018

    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 持续竞争,对程序人来说反而是好事,因为有竞争的产品才会持续进步。

    你或许对以下产品有兴趣