.NET MAUI发布Android应用因链接阶段失败求解决方案
解决.NET MAUI发布Android时SkiaSharp裁剪错误的方案
你遇到的是ILLink在处理SkiaSharp.Views.Android.dll时的元数据引用错误,核心原因是裁剪工具无法正确处理跨模块的成员引用。以下是几个无需禁用裁剪的解决方案:
方案1:直接保留SkiaSharp相关程序集
之前的配置仅保留了LiveChartsCore.SkiaSharpView.Maui,但问题出在SkiaSharp.Views.Android本身,需要将相关SkiaSharp程序集加入裁剪根目录:
<PropertyGroup> <EnableTrimAnalyzer>true</EnableTrimAnalyzer> <PublishTrimmed>true</PublishTrimmed> <TrimMode>partial</TrimMode> </PropertyGroup> <ItemGroup> <TrimmerRootAssembly Include="LiveChartsCore.SkiaSharpView.Maui" /> <!-- 添加以下两行 --> <TrimmerRootAssembly Include="SkiaSharp" /> <TrimmerRootAssembly Include="SkiaSharp.Views.Android" /> </ItemGroup>
这样会让ILLink完全跳过对这些程序集的裁剪处理,避免触发元数据错误。
方案2:精确保留特定类型(更优,减少包体积)
如果不想保留整个程序集,可以通过裁剪描述文件精确保留出错的类型:
- 在项目根目录创建
TrimmerRoots.xml文件,内容如下:
<linker> <assembly fullname="SkiaSharp.Views.Android"> <!-- 保留出错的SKCanvasView类型及其所有成员 --> <type fullname="SkiaSharp.Views.Android.SKCanvasView" preserve="all" /> </assembly> </linker>
- 在csproj中引用该描述文件:
<PropertyGroup> <EnableTrimAnalyzer>true</EnableTrimAnalyzer> <PublishTrimmed>true</PublishTrimmed> <TrimMode>partial</TrimMode> </PropertyGroup> <ItemGroup> <TrimmerRootDescriptor Include="TrimmerRoots.xml" /> <TrimmerRootAssembly Include="LiveChartsCore.SkiaSharpView.Maui" /> </ItemGroup>
这种方式只会保留必要的类型,相比保留整个程序集能更好地控制最终包体积。
方案3:升级依赖库版本
你使用的是.NET 7 Preview 2,属于早期预览版,SkiaSharp或LiveCharts可能存在适配裁剪工具的兼容性问题。尝试将SkiaSharp和LiveChartsCore.SkiaSharpView.Maui升级到适配.NET 7的稳定版本,大概率能解决底层的元数据引用问题。
内容的提问来源于stack exchange,提问作者NPadrutt
相关产品推荐
相关产品推荐

