共享项目代码共享

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

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

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

如果过去曾使用文件链接在项目之间共享代码,则共享项目的工作方式类似,但 IDE 支持得到了很大的改进。

什么是共享项目?

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

共享项目体系结构

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

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

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

Visual Studio for Mac 演练

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

创建共享项目

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

新建共享项目

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

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

空共享项目

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

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

对共享项目的项目引用

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

共享项目选项

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

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

共享项目选项

共享项目示例

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

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

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

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

iOS、Android Windows Phone示例

总结

本文档介绍了共享项目的工作原理,以及如何在 Visual Studio for Mac 和 Visual Studio 中创建和使用共享项目,并引入了一个简单的示例应用程序,用于演示共享项目的运行情况。