共享项目代码共享

使用共享项目,可以编写由多个不同的应用程序项目引用的通用代码。 此代码作为每个引用项目的一部分进行编译,并且可以包含编译器指令以帮助将特定于平台的功能合并到共享代码库中。

共享项目(有时也称为共享资产项目)允许编写在多个目标项目(包括 Xamarin 应用程序)之间共享的代码。

它们支持编译器指令,以便你可以有条件地包含要编译为引用共享项目的项目子集中的特定于平台的代码。 还有 IDE 支持来帮助管理编译器指令,并直观显示代码在每个应用程序中的外观。

如果过去曾使用文件链接在项目之间共享代码,则共享项目的工作方式类似,但 IDE 支持程度显著提高。

什么是共享项目?

与大多数其他项目类型不同,共享项目没有任何输出(以 DLL 形式),而是将代码编译到引用它的每个项目中。 下图对此进行了说明:从概念上讲,共享项目的整个内容被“复制到”每个引用项目并编译,就好像它是其中的一部分一样。

Shared Project architecture

共享项目中的代码可以包含编译器指令,这些指令将启用或禁用代码部分,具体取决于哪个应用程序项目正在使用代码,该代码由关系图中的彩色平台框建议。

共享项目本身不会进行编译,它完全作为源代码文件的分组存在,这些文件可以包含在其他项目中。 当被另一个项目引用时,代码将有效地编译为该项目的一部分。 共享项目不能引用任何其他项目类型(包括其他共享项目)。

请注意,Android 应用程序项目不能引用其他 Android 应用程序项目。例如,Android 单元测试项目不能引用 Android 应用程序项目。 请参见共享项目的详细信息。

Visual Studio for Mac 演练

本部分逐步介绍如何使用 Visual Studio for Mac 创建和使用共享项目。 有关完整示例,请参阅“共享项目示例”部分。

创建共享项目

若要创建新的共享项目,请导航到“文件”>“新建解决方案...”(或右键单击现有解决方案并依次选择“添加”>“添加新项目...”):

New Shared Project

在下一个屏幕上,选择项目名称,然后单击“创建”。

下面显示了新的共享项目。请注意,没有引用或组件节点;共享项目不支持这些项。

Empty Shared Project

若要使共享项目有用,需要由至少一个可生成的项目(例如 iOS 或 Android 应用程序或库或 PCL 项目)引用。 当没有项目引用时,共享项目不会进行编译,因此在被其他内容引用之前,不会突出显示语法(或任何其他)错误。

添加对共享项目的引用的方式与引用常规库项目的方式相同。 此屏幕截图显示了引用共享项目的 Xamarin.iOS 项目。

Project reference to Shared Project

由另一个库或应用程序引用共享项目后,可以生成解决方案并查看代码中的任何错误。 当共享项目被两个或更多个其他项目引用时,源代码编辑器左上角会显示一个菜单,其中显示了哪些项目引用了此文件。

共享项目选项

右键单击共享项目并选择“选项”时,设置比其他项目类型少。 由于共享项目不是自行编译的,因此无法设置输出或编译器选项、项目配置、程序集签名或自定义命令。 共享项目中的代码会有效地从引用它们的任何内容中继承这些值。

“选项”屏幕如下所示 - 项目名称默认命名空间是唯一将更改的两个设置。

Shared Project Options

共享项目示例

Tasky 示例使用共享项目来包含 iOS、Android 和 Windows Phone 应用程序使用的常见代码。 SQLite.csTaskRepository.cs 源代码文件都使用编译器指令(例如 #if __ANDROID__) 为每个引用它们的应用程序生成不同的输出。

完整的解决方案结构如下所示(分别在 Visual Studio for Mac 和 Visual Studio 中):

Windows Phone 项目可从 Visual Studio for Mac 内导航进入,即使 Visual Studio for Mac 中不支持编译该项目类型。

正在运行的应用程序如下所示:

iOS, Android, Windows Phone examples

总结

本文档介绍了共享项目的工作原理、如何在 Visual Studio for Mac 和 Visual Studio 中创建和使用它们,并介绍了一个简单的示例应用程序,演示了运作中的共享项目。