桌面应用移植指南

大多数应用程序代码可以归属为以下其中一类:

  • 用户界面代码(如窗口和按钮)
  • 第三方控件(如图表)
  • 业务逻辑(如验证规则)
  • 本地数据存储和访问
  • Web 服务和远程数据访问

对于使用 C#(或 Visual Basic.NET)编写的 Windows 窗体和 WPF 应用程序,可以跨平台共享大量的业务逻辑、本地数据访问和 Web 服务代码。

.NET 可移植性分析器

Visual Studio 2017 及更高版本支持 .NET 可移植性分析器下载 Windows 版本),它可以检查现有应用程序并告知有多少代码可以“按原样”移植到其他平台。

也可以从 GitHub 上的可移植性分析器下载一个命令行工具并用于提供相同的报告。

“我的代码中有 x% 是可移植的。 接下来怎么做?”

虽然希望分析器显示大部分代码是可移植的,但每个应用肯定都有一部分代码无法移动到其他平台。

不同的代码块可能会落入其中一个存储桶中,下文将详细说明:

  • 可重用的可移植代码
  • 需要更改的代码
  • 不可移植且需要重写的代码

可重用的可移植代码

针对所有平台上可用的 API 编写的 .NET 代码可以跨平台保持不变。 理想情况下,可以把所有这些代码移至可移植类库、共享库或 .NET Standard 库中,然后在现有应用中对其进行测试。

然后,可以将该共享库添加到其他平台(如 Android、iOS、macOS)的应用程序项目中。

需要更改的代码

某些 .NET API 可能并非在所有平台上都可用。 如果你的代码中存在这些 API,则需要重写这些部分代码才能使用跨平台 API。

例如,使用了 .NET 4.6 中提供的反射 API,但这些 API 并非在所有平台上都可用。

使用可移植 API 重写代码后,应该能够将该代码打包到共享库中并在现有应用中对其进行测试。

不可移植且需要重写的代码

不太可能跨平台的代码示例包括:

  • 用户界面 – 例如,不能在 Android 或 iOS 上的项目中使用 Windows 窗体或 WPF 屏幕。 需要使用此控件比较作为参考来重写用户界面。

  • 特定于平台的存储 - 依赖于平台特定技术(如本地 SQL Server Express 数据库)的代码。 需要使用跨平台替代项(如 SQLite 作为数据库引擎)进行重写。 某些文件系统操作可能还需要调整,因为 UWP 的 API 与 Android 和 iOS 略有不同(例如,某些文件系统区分大小写,而其他文件系统则不区分大小写)。

  • 第三方组件 – 检查应用程序中的第三方组件在其他平台上是否可用。 有些(如非视觉 NuGet 包)可能可用,但也有一些(尤其是图表或媒体播放器等视觉控件)可能不可用

使代码可移植的技巧

  • 依赖关系注入 – 为每个平台提供不同的实现,以及

  • 分层方法 – MVVM、MVC、MVP 或者其他一些有助于将可移植代码与特定于平台的代码分开的模式。

  • 消息传递 – 可以在代码中使用消息传递将应用程序不同部分之间的交互分离。