PCL或者SAP?
当你第一次在Visual Studio中创建Hello解决方案时,你有两个应用程序模板选项:
空白应用 (Xamarin.Forms Portable)
空白应用 (Xamarin.Forms Shared)
在Xamarin Studio中,选择体现在一对单选按钮中
使用可移植类库
使用共享库
第一个选项创建可移植类库(PCL),而第二个选项创建仅由共享代码文件组成的共享资源项目(SAP)。 原来的Hello解决方案使用了PCL模板。 现在让我们用SAP模板创建一个名为HelloSap的第二个解决方案。
正如你将会看到的,除了HelloSap项目本身只包含一个项目:App.cs文件外,其他一切看起来都差不多。
使用PCL和SAP方法,代码在五个应用程序之间共享,但采用截然不同的方式:使用PCL方法,将所有常见代码捆绑到一个动态链接库中,每个应用程序项目在运行时引用并绑定。 使用SAP方法,通用代码文件在构建时与五个应用程序项目中的每一个有效地包含在一起。 默认情况下,SAP只有一个名为App.cs的文件,但实际上好像这个HelloSap项目不存在,而是在五个应用程序项目中有五个不同的副本。
一些微妙的(而不是那么微妙的)问题可以用共享的图书馆方法表现出来。
iOS和Android项目可以访问几乎相同的.NET版本,但与Windows项目使用的版本不同。 这意味着由共享代码访问的任何.NET类可能会有所不同,具体取决于平台。 正如你将会在本书后面发现的,System.IO命名空间中的一些文件I / O类就是这种情况。
您可以使用C#预处理器指令来补偿这些差异,特别是#if和#elif。 在由Xamarin.Forms模板生成的项目中,各种应用程序项目定义了可以与这些指令一起使用的符号。
这些符号是什么?
在Visual Studio中,右键单击解决方案资源管理器中的项目名称,然后选择“属性”。 在属性屏幕的左侧,选择Build,然后查找Conditional编译符号字段。
在Xamarin Studio中,在解决方案列表中选择一个应用程序项目,调用下拉工具菜单,然后选择选项。 在“项目选项”对话框的左侧,选择“生成”>“编译器”,然后查找“定义符号”字段。
以下是您可以使用的符号:
iOS项目:您将看到符号__IOS__(前后有两个下划线)
Android项目:您将看不到任何为指示平台而定义的符号,但无论如何定义了标识符__ANDROID__以及多个__ANDROID_nn__标识符,其中每个Android API级别都支持。
UWP项目:符号WINDOWS_UWP
Windows项目:符号WINDOWS_APP
Windows Phone项目:符号WINDOWS_PHONE_APP
你的共享代码文件可以包含这样的块:
点击(此处)折叠或打开
#if __IOS__
// iOS specific code
#elif __ANDROID__
// Android specific code
#elif WINDOWS_UWP
// Universal Windows Platform specific code
#elif WINDOWS_APP
// Windows 8.1 specific code
#elif WINDOWS__PHONE_APP
// Windows Phone 8.1 specific code
#endif
这允许您的共享代码文件运行平台特定的代码或访问平台特定的类,包括单个平台项目中的类。 如果您愿意,您也可以定义自己的条件编译符号。
这些预处理器指令在可移植类库项目中没有意义。 PCL完全独立于五个平台,并且在编译PCL时平台项目中的这些标识符不存在。
PCL的概念最初是由于每个使用.NET的平台实际上都使用了.NET的一些不同的子集。 如果要创建可在多个.NET平台中使用的库,则只需使用这些.NET子集的公共部分。
PCL旨在通过包含可在多个(但特定的).NET平台上使用的代码来提供帮助。 因此,任何特定的PCL都包含一些嵌入的标志,表明它支持哪些平台。 Xamarin.Forms应用程序中使用的PCL必须支持以下平台:
.NET Framework 4.5
Windows 8
Windows Phone 8.1
Xamarin.Android
Xamarin.iOS
Xamarin.iOS (Classic)
这就是所谓的PCL配置文件111。
如果您在PCL中需要特定于平台的行为,则不能使用C#预处理器指令,因为这些指令只能在构建时使用。 您需要运行时可以使用的东西,例如Xamarin-.Forms设备类。 你会很快看到一个例子。
Xamarin.Forms PCL可以访问支持相同平台的其他PCL,但不能直接访问在各个应用程序项目中定义的类。 但是,如果您需要这样做,您将在第9章“特定于平台的API调用”中看到一个示例-Xamarin.Forms提供了一个名为DependencyService的类,允许您从PCL访问平台特定的代码 有条不紊的方式。
本书中的大部分程序都使用PCL方法。 对于Xamarin.Forms,这是推荐的方法,许多程序员喜欢Xamarin.Forms一段时间。 但是,SAP方法也得到支持,并且也有其支持者。 展示SAP方法的这些页面中的程序总是在其名称末尾包含字母Sap,例如HelloSap程序。
但为什么选择呢? 你可以有两个在同一个解决方案。 如果您已经使用Shared Asset Project创建了Xamarin.Forms解决方案,则可以通过选择ClassLibrary(Xamarin.Forms Portable)模板将新的PCL项目添加到解决方案中。 应用程序项目可以访问SAP和PCL,SAP也可以访问PCL。