VS2022开发Xamarin应用集成AdMob时AdView.LoadAd报错求助
Xamarin.Android 集成AdMob时LoadAd抛出getClass类型异常修复方案
错误诱发原因
该异常属于Google Play Services(GMS)依赖版本冲突导致的运行时类校验错误:当项目中引用的AdMob相关NuGet包和其他GMS基础依赖包版本不匹配时,com.google.android.gms.dynamic.Object类会被重复加载不同版本的字节码,类校验阶段判定Object.getClass()方法的类型标记不符合预期,最终在调用adView.LoadAd()触发类加载时抛出异常,和当前写的广告加载业务代码逻辑无直接关联。
常见触发场景包括:
- 项目中不同GMS系NuGet包版本号不一致,比如Ads包版本较高,但依赖的Base、Basement等基础包被自动降级到低版本
- 链接器错误裁剪了AdMob相关的必要类,导致运行时类签名不匹配
- 使用了过时的Xamarin.GooglePlayServices.Ads包,和当前VS2022安装的Xamarin.Android SDK版本不兼容
修复步骤
- 统一所有GMS依赖版本
打开Android项目的NuGet包管理面板,将所有前缀为Xamarin.GooglePlayServices.的包全部升级到同一稳定版本,重点核对以下包的版本号完全一致:- Xamarin.GooglePlayServices.Ads
- Xamarin.GooglePlayServices.Base
- Xamarin.GooglePlayServices.Basement
- Xamarin.GooglePlayServices.Tasks
如果项目同时集成了Firebase相关服务,也要将所有Xamarin.Firebase前缀的包升级到和当前GMS版本匹配的对应版本,避免依赖传递带来的隐式版本冲突。
- 补全AdMob全局初始化逻辑
不能在创建AdView实例时直接加载广告,必须先在MainActivity.OnCreate生命周期中完成AdMob SDK全局初始化,再执行页面加载、广告创建逻辑:// MainActivity.cs 的OnCreate方法中,在LoadApplication(new App())之前添加 MobileAds.Initialize(this); - 调整链接器配置避免类被裁剪
打开Android项目属性,进入「Android选项-链接器」设置页:- 如果当前链接器行为选择的是「Sdk和用户程序集」,建议测试时先改成「仅Sdk程序集」验证问题是否消失
- 如需保留全量链接配置,可在项目中新增
LinkerPleaseInclude.cs文件,写入以下代码强制保留AdMob相关类,避免被链接器误裁剪:
using Android.Gms.Ads; public class LinkerPleaseInclude { public void PreserveAdsTypes() { _ = new AdView(null); _ = new AdRequest.Builder().Build(); } } - 全量清理重建项目
关闭Visual Studio,手动删除Android项目目录下的bin、obj文件夹,重新打开解决方案后依次执行「清理解决方案」「还原NuGet包」,再重新编译部署到设备测试,不要直接使用增量编译的旧构建产物。
验证小技巧:如果完成以上步骤后仍报错,可以临时把自适应横幅AdSize改成固定值
AdSize.Banner测试,排除自适应广告API的版本兼容问题,确认基础广告加载正常后再切回自适应尺寸即可。
内容的提问来源于stack exchange,提问作者James Dsouza
相关产品推荐
相关产品推荐

