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
相关产品推荐
相关产品推荐

