Xamarin.Forms Android环境实例化ServiceBusClient抛出NotImplementedException求助
异常诱因
- Azure.Messaging.ServiceBus 从7.1版本开始,将ServiceBusClient的实现接口从IDisposable调整为IAsyncDisposable。当前使用的Xamarin.Forms Android 运行时(Mono框架)对.NET Standard 2.1 中的IAsyncDisposable类型存在运行时兼容缺陷,实例化过程中调用到未实现的运行时接口方法,因此抛出NotImplementedException异常。
- 7.0版本包未引入IAsyncDisposable改造,因此可以正常运行。独立NUnit测试运行在完整.NET/.NET Core运行时环境,不存在该兼容缺陷,因此无法复现问题。
- 2个月前可正常运行是因为当时项目依赖的包版本未升级到7.1+,或是Android运行时环境未做变更。
解决方法
- 降级NuGet包版本
直接将Azure.Messaging.ServiceBus包固定到7.0.x版本,该版本经过验证可在当前项目环境下正常运行,是成本最低的适配方案。 - 升级运行时兼容支持
如果需要使用高版本ServiceBus包的新特性,可以做以下配置修改:- 将Android项目的目标框架版本升级到Android 11(API 30)及以上,新版Mono运行时已经修复了IAsyncDisposable的实现缺陷
- 项目中手动引入
Microsoft.Bcl.AsyncInterfacesNuGet包,补全IAsyncDisposable相关类型的兼容定义
- 临时适配方案
实例化ServiceBusClient时传入自定义ServiceBusClientOptions配置,关闭IAsyncDisposable相关的默认初始化逻辑,手动管理对象生命周期,避免调用到存在兼容问题的运行时接口。
内容的提问来源于stack exchange,提问作者Scott Nimrod
相关产品推荐
相关产品推荐

