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

Android平台下为何调用.NET Standard类而非Android专属类?

解决Android平台优先使用.NET Standard类而非平台特定实现的问题

看起来你的问题出在MSBuild配置的细节上——虽然你已经设置了平台特定的Compile规则,但Android编译时并没有明确排除.NET Standard的实现文件,导致编译器可能优先选择了netstandard版本的类。结合你的配置和问题场景,我给你几个具体的修复步骤:

1. 修正csproj配置:明确排除非当前平台的实现文件

你的当前配置在全局移除了所有平台文件,但在Android的条件组里只添加了.android.cs,却没有排除.netstandard.cs。这会让编译器在编译Android版本时,同时看到netstandard和android的实现文件(如果类名/命名空间一致,就会出现优先级问题)。

把你的csproj配置更新为以下内容:

<TargetFrameworks>netstandard2.0;xamarinios10;monoandroid90;</TargetFrameworks>

<!-- 全局默认移除所有平台特定文件 -->
<ItemGroup>
  <Compile Remove="**\*.netstandard.cs" />
  <Compile Remove="**\*.android.cs" />
  <Compile Remove="**\*.ios.cs" />
  <Compile Remove="**\*.windows.cs" />
  <Compile Remove="**\*.shared.cs" />
  <Compile Remove="**\*.shared.*.cs" />
</ItemGroup>

<!-- Android平台:仅包含android实现,排除其他平台的文件 -->
<ItemGroup Condition=" $(TargetFramework.StartsWith('monoandroid')) ">
  <Compile Include="**\*.android.cs" />
  <Compile Remove="**\*.netstandard.cs" />
  <Compile Remove="**\*.ios.cs" />
  <AndroidResource Include="Resources\xml\*.xml" />
  <AndroidAsset Include="Assets\**\*" />
</ItemGroup>

<!-- iOS平台:仅包含ios实现,排除netstandard文件 -->
<ItemGroup Condition=" $(TargetFramework.StartsWith('xamarinios')) ">
  <Compile Include="**\*.ios.cs" />
  <Compile Remove="**\*.netstandard.cs" />
</ItemGroup>

<!-- .NET Standard平台:仅包含netstandard实现 -->
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
  <Compile Include="**\*.netstandard.cs" />
</ItemGroup>

2. 验证平台特定类的命名规范

确保你的平台实现类满足以下要求:

  • 相同的类名和命名空间(比如MyUtility.netstandard.cs和MyUtility.android.cs里的类都是namespace MyApp.Utils { public class MyUtility { ... } })
  • 类都是public访问修饰符(如果需要被其他项目引用)
  • 文件名后缀严格匹配配置里的规则(.android.cs、.ios.cs、.netstandard.cs)

3. 清理并重新生成项目

有时候旧的编译缓存会导致问题,执行以下步骤:

  • 删除类库项目和Android项目的bin、obj文件夹
  • 在你的IDE里选择清理解决方案,然后重新生成解决方案

4. 确认Android项目的TargetFramework

检查你的Android项目属性,确保它的目标框架是monoandroid90,和类库配置里的monoandroid90完全一致——版本不匹配也可能导致平台筛选失效。

如果做完这些步骤,Android平台应该会优先使用.android.cs里的实现,而不是.NET Standard版本的类了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:52:41