共享代码概述

本文档比较跨平台项目之间共享代码的不同方法:.NET Standard、共享项目,和可移植类库,包括每个方法的优缺点。

有三种方法可以跨平台应用程序之间共享代码:

  • .NET Standard 库 – .NET Standard 项目可以实现跨多个平台共享的代码,并且可以访问大量 .NET API(具体取决于版本)。 .NET Standard 1.0 - 1.6 逐步实现更大的 API 集,而 .NET Standard 2.0 提供 .NET BCL 的最佳覆盖范围(包括 Xamarin 应用中提供的 .NET API)。
  • 共享项目 –使用共享资产项目类型来组织源代码,并根据需要使用 #if 编译器指令来管理特定于平台的要求。
  • 可移植类库 (已弃用) - 可移植类库 (PCL) 可以面向具有通用 API 图面的多个平台,并使用接口提供特定于平台的功能。 Visual Studio 的最新版本中弃用了 PCL,而是使用 .NET Standard。

代码共享策略的目标是支持此关系图中显示的体系结构,其中多个平台可以使用单个代码库。

Shared code application architecture

本文比较了可用于帮助你为应用程序选择正确的项目类型的方法。

.NET Standard 库

.NET Standard 库提供了一组定义完善的基类库,这些库可在不同的项目类型(包括 Xamarin.Android 和 Xamarin.iOS 等跨平台项目)中引用。 建议使用 .NET Standard 2.0 以实现与现有 .NET Framework 代码的最大兼容性。

.NET Standard diagram

好处

  • 允许跨多个项目共享代码。
  • 重构操作始终会更新所有受影响的引用。
  • .NET 基类库 (BCL) 的外围应用比 PCL 配置文件更大。 具体而言,.NET Standard 2.0 的 API 表面与 .NET Framework 几乎相同,建议用于新应用并移植现有 PCL。

缺点

  • 不能使用编译器指令,如 #if __IOS__

注解

.NET Standard 类似于 PCL,但具有更简单的平台支持模型和更多 BCL 中的类。

共享项目

共享项目包含引用它们的任何项目中的代码文件和资产。 共享项目不会自行生成已编译的输出。

此屏幕截图显示了包含三个应用程序项目(适用于 Android、iOS 和 Windows)的解决方案文件,其中有一个共享项目,其中包含常见 C# 源代码文件:

Shared project solution

概念体系结构显示在下图中,其中每个项目都包含所有共享源文件:

Shared project diagram

示例

支持 iOS、Android 和 Windows 的跨平台应用程序需要每个平台的应用程序项目。 公共代码位于共享项目中。

示例解决方案将包含以下文件夹和项目(项目名称的选择是为了便于表达,你的项目不必遵循这些命名准则):

  • Shared – 共享项目,包含所有项目通用代码。
  • AppAndroid – Xamarin.Android 应用程序项目。
  • AppiOS – Xamarin.iOS 应用程序项目。
  • AppWindows – Windows 应用程序项目。

这样,三个应用程序项目将共享相同的源代码(Shared 中的 C# 文件)。 对共享代码的任何编辑都将在所有三个项目之间共享。

好处

  • 允许跨多个项目共享代码。
  • 可以使用编译器指令(例如,使用 #if __ANDROID__,如在生成跨平台应用程序文档中所述)基于平台分支共享代码。
  • 应用程序项目可包含共享代码可利用的特定平台引用(例如,在 Windows Phone 的 Tasky 示例中使用 Community.CsharpSqlite.WP7)。

缺点

  • 影响“非活动”编译器指令内代码的重构不会更新这些指令中的代码。
  • 与其他大多数项目类型不同,共享项目没有“输出”程序集。 在编译期间,文件被视为引用项目的一部分,并编译到该程序集中。 如果要将代码共享为程序集,则 .NET Standard 或可移植类库是更好的解决方案。

注解

一个很好的解决方案,适用于编写代码的应用程序开发人员,该代码仅用于在应用中进行共享(而不是分发给其他开发人员)。

可移植类库

提示

建议使用 .NET Standard 2.0 库而不是可移植类库。

可移植类库在此处有详细讨论

Portable class library diagram

好处

  • 允许跨多个项目共享代码。
  • 重构操作始终会更新所有受影响的引用。

缺点

  • 在最新版本的 Visual Studio 中弃用,建议改用 .NET Standard 库。 请参阅此 PCL 与 .NET Standard 之间的差异的说明
  • 不能使用编译器指令。
  • 只能使用 .NET Framework 的子集,由所选配置文件确定(有关详细信息,请参阅 PCL 简介)。

注解

PCL 模板在最新版本的 Visual Studio 中被视为已弃用。

总结

你选择的代码共享策略将由目标平台驱动。 选择最适合你的项目的方法。

.NET Standard 是构建可共享代码库(特别是在 NuGet 上发布)的最佳选择。 共享项目适用于计划在其跨平台应用中使用大量特定于平台的功能的应用程序开发人员。

尽管 Visual Studio 中仍支持 PCL 项目,但建议对新项目使用 .NET Standard。