为什么 C# 不仅仅局限于 Windows?
\n\n长期以来,C# 一直与微软和 Windows 生态系统紧密关联。想要为 Linux 或 macOS 编写代码的开发者,往往会转向 Java、Python 或 JavaScript。但时代已经变了。随着 .NET Core(以及随后的 .NET 5/6/7/8)的发布,微软果断迈入了开源和跨平台的世界。
\n\n如今,C# 是一种强大、现代的语言,可以用来构建一切:从 Linux 服务器的控制台工具,到 iOS 和 Android 的移动应用。所有这些都使用同一种语言、同一个 IDE(Rider 或 VS Code),并且重要的是,拥有统一的业务逻辑代码。
\n\n在本文中,我们将探讨哪些技术允许你用 C# 编写跨平台应用,对它们进行比较,展示实际代码,并提供实用建议。如果你认为 C# “只适用于 Windows”,请准备好大吃一惊。
\n\n.NET 跨平台能力的演进
\n\nC# 走向跨平台的道路是漫长的。让我们回顾一下主要的里程碑:
\n\n- \n
- Mono (2004) — 首个面向 Linux 的 .NET Framework 开源实现。可以运行,但有限制。 \n
- Xamarin (2011) — 允许用 C# 为 iOS 和 Android 编写移动应用。真正的突破。 \n
- .NET Core (2016) — 完全重写、模块化、跨平台的框架。开源。 \n
- .NET 5+ (2020) — 统一所有分支:.NET Framework、.NET Core 和 Xamarin 合并为统一的 .NET。 \n
- .NET MAUI (2022) — Xamarin.Forms 的演进,用于为所有平台创建原生 UI。 \n
现在,在 2024 年,我们拥有成熟的工具集,可以为任何平台进行开发。让我们看看主要选项。
\n\nC# 跨平台开发的主要技术
\n\n技术的选择取决于你具体要编写什么。我们确定了四个主要方向:
\n\n1. .NET MAUI — 原生移动和桌面应用
\n\n.NET MAUI(多平台应用 UI)是一个用于创建用户界面的框架,这些界面可在 Android、iOS、macOS、Windows 以及(实验性地)Linux 上运行。你只需编写一次 XAML 标记和 C# 逻辑,就能获得原生应用。
\n\n代码示例:一个简单的计数器应用
\n\n<!-- MainPage.xaml -->\n<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"\n xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"\n x:Class="MauiApp1.MainPage">\n <VerticalStackLayout Padding="30" Spacing="25">\n <Label Text="你好,跨平台!"\n FontSize="32"\n HorizontalOptions="Center"/>\n <Label x:Name="CounterLabel"\n Text="0"\n FontSize="48"\n HorizontalOptions="Center"/>\n <Button Text="点我"\n Clicked="OnCounterClicked"\n HorizontalOptions="Center"/>\n </VerticalStackLayout>\n</ContentPage>\n\n// MainPage.xaml.cs\nnamespace MauiApp1;\n\npublic partial class MainPage : ContentPage\n{\n private int _count = 0;\n\n public MainPage()\n {\n InitializeComponent();\n }\n\n private void OnCounterClicked(object sender, EventArgs e)\n {\n _count++;\n CounterLabel.Text = _count.ToString();\n }\n}\n\n这段代码无需修改即可在 iPhone、Android 智能手机、MacBook 和 Windows PC 上运行。对于 Linux,需要额外配置,但社区正在积极解决这个问题。
\n\n2. Avalonia UI — 适用于 Windows、Linux 和 macOS 的桌面应用,具有独特设计
\n\nAvalonia 是一个开源框架,其灵感来自 WPF,但完全跨平台。它的主要特点是:它不模拟原生控件,而是通过 SkiaSharp 绘制自己的界面。这提供了完