Xamarin.Forms Release编译报Mono.Linker.MarkException错误求助
我之前在使用Xamarin.Forms 2.x版本时也碰到过一模一样的Release构建链接错误,本质是链接器在优化过程中找不到Xamarin.Forms.Log.Warning方法——这个方法被Xamarin.Forms.Pages.dll引用,但链接器误将其标记为可删除的无用代码,最终导致依赖缺失报错。下面是几个验证有效的解决办法,建议按优先级尝试:
方法1:给链接器添加保留规则
当前你用的是Sdk Assemblies Only链接模式,先试试这个精准修复方案:
- 在Android项目根目录新建一个
Linker.xml文件,右键文件设置Build Action为LinkDescription; - 在文件里添加以下规则,强制链接器保留
Xamarin.Forms.Log类的所有成员:
<linker> <assembly fullname="Xamarin.Forms.Core"> <type fullname="Xamarin.Forms.Log" preserve="all" /> </assembly> </linker>
这样链接器就不会误删Xamarin.Forms.Log.Warning方法了。
方法2:升级Xamarin.Forms版本
你当前使用的2.5.1.527436版本确实存在链接器相关的已知bug,官方在后续的2.5.x补丁包(比如2.5.1.858093)以及3.x稳定版本中修复了这个问题。如果项目允许,直接升级到对应版本能从根源解决问题。
方法3:统一NuGet包版本
确保你的共享项目和Android项目引用的Xamarin.Forms、Xamarin.Forms.Pages版本完全一致——版本不匹配很容易导致链接时出现依赖缺失。可以右键解决方案→Manage NuGet Packages for Solution,统一更新所有项目的相关包到同一版本。
方法4:彻底清理重建项目
有时候是缓存文件干扰导致的问题,按以下步骤操作:
- 右键解决方案→选择Clean Solution;
- 手动删除所有项目目录下的
bin和obj文件夹; - 重启VS2017后,重新构建Release版本。
额外排查项
如果以上方法都无效,可以尝试关闭Enable ProGuard(在Android项目属性→Android Options→Packaging选项卡中),旧版本的Xamarin.Android中ProGuard的混淆规则可能和链接器产生冲突。
内容的提问来源于stack exchange,提问作者Mark Erickson

