仅VS2022生成Xamarin.Forms Android应用时Akavache抛出MissingMethodException
基于Xamarin Forms开发、使用Akavache实现数据缓存的应用,VS2019构建时iOS、Android端调试模式运行均正常,安装VS2022后未改动任何项目配置,构建部署Android版本触发如下异常:
[AppCenterCrashes] Unhandled Exception from source=AndroidEnvironment
[AppCenterCrashes] System.MissingMethodException: Method not found: System.ReadOnlySpan1<byte> SQLitePCL.raw.sqlite3_column_blob(SQLitePCL.sqlite3_stmt,int) [AppCenterCrashes] at Akavache.Sqlite3.SqliteOperationQueue.MarshalCompletion[T] (System.Object completion, System.Func1[TResult] block, System.IObservable`1[T] commitResult) [0x00012] in D:\a\Akavache\Akavache\src\Akavache.Sqlite3\Queues\OperationQueue.cs:488
[AppCenterCrashes] --- End of stack trace from previous location where exception was thrown ---
该错误由SQLitePCLRaw依赖版本不匹配导致:VS2022的Android构建工具默认会隐式升级SQLitePCLRaw包版本,旧版SQLitePCLRaw中sqlite3_column_blob方法返回值为byte[],升级后的新版返回值改为ReadOnlySpan<byte>,而当前使用的Akavache版本适配的是旧版方法签名,运行时找不到对应方法就会抛出MissingMethodException。
- 统一SQLitePCLRaw显式版本:在共享库、Android项目中都手动安装和当前Akavache版本适配的SQLitePCLRaw固定版本,例如Akavache 7.x版本对应SQLitePCLRaw 2.0.7版本,禁止版本自动升级。安装完成后清理解决方案,手动删除所有项目的bin、obj文件夹后重新构建即可。
- 升级Akavache到最新稳定版:将Akavache所有相关包升级到最新稳定版,同时保证所有SQLitePCLRaw相关依赖版本对齐,升级后在Android项目MainActivity的OnCreate方法中、Akavache初始化之前,添加
SQLitePCL.Batteries_V2.Init();代码,确保原生SQLite绑定正确加载。 - 回退Android构建工具版本:在VS2022的Android项目属性页中,将Android构建工具版本修改为VS2019使用的对应版本,关闭项目的隐式NuGet包升级选项,还原VS2019的构建环境。
内容的提问来源于stack exchange,提问作者Damien Doumer

