Xamarin Forms Release模式编译报Mono.Linker.MarkException错误求助
报错核心原因
Release模式下Xamarin会默认启用程序集链接器裁剪冗余代码,该报错的本质是链接器无法解析Microsoft.Net.Http.Headers依赖的Microsoft.Extensions.Primitives程序集中的InplaceStringBuilder类型,通常由Nuget包版本不匹配、链接器过度裁剪两个原因导致。
排查与解决步骤
- 首先校验Nuget包版本一致性:确保项目中安装的
Microsoft.Net.Http.Headers和Microsoft.Extensions.Primitives两个Nuget包的主版本号完全匹配,不要跨大版本搭配使用,版本不兼容是该问题的最高发诱因。 - 验证链接器裁剪问题:右键Xamarin.Android项目 -> 选择「属性」-> 切换到「Android选项」页签 -> 将Release配置下的「链接器行为」从默认的「仅裁剪SDK程序集」/「裁剪所有程序集」修改为「不裁剪」,重新编译如果不再报错,即可确认是链接器过度裁剪导致的问题。
- 配置链接器保留指定程序集:确认是链接器问题后,不要长期使用「不裁剪」配置(会导致安装包体积大幅增大),可通过自定义链接器配置文件保留相关程序集不被裁剪:
- 在Xamarin.Android项目根目录新建
LinkerConfig.xml文件,写入以下内容:
<linker> <assembly fullname="Microsoft.Extensions.Primitives" preserve="all" /> <assembly fullname="Microsoft.Net.Http.Headers" preserve="all" /> </linker>- 右键
LinkerConfig.xml文件 -> 选择「属性」-> 将「生成操作」修改为链接器描述文件。
- 在Xamarin.Android项目根目录新建
- 清理缓存重编译:删除项目根目录下的bin、obj文件夹,清理本地Nuget缓存后重新执行Release编译,即可解决绝大多数场景下的该报错。
- 兜底方案:如果上述操作后仍报错,可将两个相关Nuget包统一降级到6.0.x的LTS版本,高版本AspNetCore类库在Xamarin平台下存在较多兼容性问题。
内容的提问来源于stack exchange,提问作者Arjay Maligaya
相关产品推荐
相关产品推荐

