You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms安卓调试时__ANDROID__条件编译分支未生效问题

问题根本原因
  • 条件编译是编译期静态生效的逻辑,和Device.RuntimePlatform的运行时判断完全是两套机制:#if分支的代码在程序集编译完成时就已经固定死了,不会随着运行平台变化切换。你现在调用的类库编译阶段没有定义__ANDROID__符号,所以不管你在安卓真机还是模拟器上运行,最终执行的都是编译时就选中的#else分支,和运行时拿到的Android平台标识没有关系。
  • 如果你是直接引用类库源码而非预编译dll,出现这个问题的原因是:__ANDROID__、__IOS__这类平台专属条件编译符号,默认只会在Xamarin解决方案里的平台头项目(即直接跑在对应系统上的Android项目、iOS项目)中自动定义,你自己新建的公共类库(尤其是.NET Standard类库)默认不会自动注入这些平台符号,哪怕类库代码被Android头项目调用,类库本身编译时也识别不到这些符号。
  • 额外注意:你代码中写的__WinOS__不是Xamarin或.NET SDK预置的官方平台条件符号,Windows平台对应的官方预置符号通常是WINDOWS_UWP(对应UWP平台),自定义符号如果没有手动配置定义,永远不会进入对应分支。
平台条件编译符号的配置位置

分两种场景配置:

  • 场景1:引用预编译的类库dll/NuGet包
    这类场景下你没法在主项目里配置符号来修改已经编译好的类库逻辑,必须在类库本身的编译阶段做配置。正确做法是给类库配置多目标框架,分别面向monoandroid13.0(对应传统Xamarin.Android)、xamarin.ios10(对应传统Xamarin.iOS)、uap10.0(对应UWP),或者.NET6+版本下的net6.0-android、net6.0-ios、net6.0-windows等平台专属目标框架,编译时SDK会自动为对应目标框架注入__ANDROID__、__IOS__等官方预置符号,最终会为每个平台生成独立的类库程序集,运行时主项目会自动加载匹配当前平台的版本。
  • 场景2:直接在解决方案中引用类库源码
    • 如果你用的是Xamarin共享项目(Shared Project)类型:不需要额外手动配置,共享项目的代码会被整合到引用它的平台头项目中一起编译,头项目自带的平台符号会自动生效。
    • 如果你用的是普通类库/.NET Standard类库:右键类库项目选择「属性」,切换到「生成」选项卡,顶部先选中你要配置的编译配置(Debug/Release)和目标框架,再在「条件编译符号」输入框中添加当前目标框架对应的平台符号即可,比如针对Android目标框架添加__ANDROID__,针对iOS目标框架添加__IOS__。

补充:如果不需要把代码抽成独立类库分发,Xamarin.Forms中做平台差异化逻辑更推荐用内置的DependencyService依赖服务、或者运行时平台判断实现,不会出现条件编译符号不生效的问题。

内容的提问来源于stack exchange,提问作者Mateusz Matejko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:21:28