条件编译似乎在 Xamarin Studio 中不起作用

Posted

技术标签:

【中文标题】条件编译似乎在 Xamarin Studio 中不起作用【英文标题】:Conditional Compilation seems to be not working in Xamarin Studio 【发布时间】:2017-04-26 15:22:02 【问题描述】:

我创建了一个 Xamarin Forms 应用程序。 在一个带有名为“MyLabel”的标签的新页面内。 在我的页面后面的代码中,我有

private void SetUpUI()

    #if __ios__
    this.MyLabel.BackgroundColor = Color.Navy;
    #endif

在我的 iOS 项目选项中,我可以在“编译器”选项卡中看到符号 __IOS__。 (请看截图)

当我在 iOS 中运行时,它不会使标签变为蓝色:

但如果我删除 #if __IOS__ 块,它会使标签变为蓝色:

所以看来条件编译不起作用。 我在 Mac 上。所以无法在 Visual Studio 上进行测试。 坚持了很长时间,但无法弄清楚我错过了什么。

【问题讨论】:

【参考方案1】:

SushiHangover 的答案是正确的:您的 PCL 项目 不会有平台的编译器定义。

但是,自 Xamarin Forms 2.3.4 发布以来,他提供的解决方案已经过时。 Device.OnPlatform 已按照this discussion 中的讨论进行了重新设计,并在this Pull Request 中实现。

在 Xamarin Forms 2.3.4 及更高版本中执行此操作的正确方法是使用 Device.RuntimePlatform。使用开关或条件来满足您的需求,如下所示:

if(Device.RuntimePlatform == Device.iOS)

    // iOS

else if(Device.RuntimePlatform == Device.android)

    // Android

如果您要使用共享项目而不是 PCL,则可以按照您的要求进行操作。因为当您使用共享项目时,您可以访问平台项目的编译器指令。

【讨论】:

【参考方案2】:

您在 PCL 项目 中使用了不包含那些编译器定义的条件,因此您的条件代码变灰了。

在您的 PCL 项目中,您可以使用 Device.OnPlatform 执行基于平台的处理:

Device.OnPlatform (iOS: () => this.MyLabel.BackgroundColor = Color.Navy; );

回复:https://developer.xamarin.com/api/member/Xamarin.Forms.Device.OnPlatform/

【讨论】:

如果您使用的是之前 v2.3.4 版本的 Xamarin Forms 版本,这是要走的路。否则,请使用我在回答中所述的Device.RuntimePlatform

以上是关于条件编译似乎在 Xamarin Studio 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin Studio 是不是应该在为调试目标编译时生成 APK?

在Xamarin iOS的Visual Studio App Center中构建失败:只有在使用/ unsafe进行编译时才会出现不安全的代码

从 Visual Studio 使用 Xamarin 创建 Mac 应用

在 Visual Studio 上运行 Xamarin Forms iOS 时出现 GetBuiltProjectOutputRecursive 错误

MvvmCross、Xamarin Studio 和 ICommands

Visual Studio 2017为xamarin表单创建空解决方案