Xamarin.Forms Android项目升级NuGet后Cecil程序集解析错误如何解决
问题根因
这个错误是Xamarin.AndroidX迁移工具内置的Mono.Cecil组件的版本匹配规则导致的,和NuGet的依赖解析逻辑无关:
- 你的BaseClasses包编译时引用的是1.0.63版本的Tools,因此其dll的程序集清单中硬编码了对
My.App.Tools Version=1.0.63.0的强引用 - NuGet的版本浮动规则只会处理包的下载和项目层面的引用优先级,你项目中最终引用1.0.64版本的Tools是符合NuGet规则的,但Mono.Cecil的默认程序集解析器不会读取NuGet的依赖解析结果,只会严格匹配程序集清单中标注的版本号,找不到1.0.63版本的dll就会直接抛出解析失败错误
- 从构建日志也可以看到,错误刚好发生在
_AndroidXCecilfy任务执行阶段,验证了是Cecil解析导致的问题
无需修改BaseClasses包的解决方案
方案1:添加程序集绑定重定向
在Android项目根目录新增/修改App.config文件,添加如下配置,强制将所有版本的Tools程序集指向当前使用的1.0.64版本:
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="My.App.Tools" publicKeyToken="null" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.0.64.0" newVersion="1.0.64.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
修改后清理项目缓存重新编译即可,绝大多数场景下该方案可直接解决问题。
方案2:禁用AndroidX Cecil迁移任务
如果你的项目已经完成AndroidX全量迁移,不存在任何旧Android Support库的引用,可直接禁用导致问题的Cecil迁移任务:
在Android项目的.csproj文件的第一个<PropertyGroup>节点中添加如下配置:
<AndroidXSkipCecilfy>true</AndroidXSkipCecilfy>
该方案会跳过Cecil的程序集扫描修改步骤,自然不会触发版本解析错误。
方案3:临时兼容方案
如果上述方案都不生效,可在项目的预生成事件中,将1.0.64版本的Tools dll复制一份,重命名为匹配1.0.63版本的文件名,供Cecil解析时读取,该方案仅做应急使用,不推荐长期使用。
内容的提问来源于stack exchange,提问作者stealthjong
相关产品推荐
相关产品推荐

