SkiaSharp中SKSvg.Load方法抛出MissingMethodException求助
我在Xamarin.Core/Xamarin.iOS项目中使用SkiaSharp库加载Core库中的SVG文件,代码如下:
var svg = new SKSvg(); Assembly assembly = type.GetTypeInfo().Assembly; using (Stream stream = assembly.GetManifestResourceStream($"{assembly.GetName().Name}.Images.watermark_light.svg")) { svg.Load(stream); }
执行到svg.Load(stream)步骤时抛出异常:
System.MissingMethodException: Method not found: SkiaSharp.SKTextBlob SkiaSharp.SKTextBlob.CreatePositioned(string,SkiaSharp.SKFont,System.ReadOnlySpan`1<SkiaSharp.SKPoint>)
项目配置
- 设备:Debug|Simulator
- 链接器行为:Don't link
- Xamarin.iOS 15.4.0.0
- Xcode 13.2 (8fc41ae82)
- Rider IDE: RD-221.5591.20
- 系统:MacOS Monterey 12.4 (21F79)
使用的库版本
- SkiaSharp v2.88.1-preview.79
- SkiaSharp.Views v2.88.1-preview.79
- Svg.Skia v0.5.14
- SkiaSharp.Svg v1.60.0
- SVG文件路径:CoreLibrary/Images/watermark_light.svg
我已经尝试在LinkerPleaseInclude.cs中添加SKTextBlob的引用,也添加了相关命名空间的--linkskip参数,但都没有效果。请问该如何解决这个问题?
1. 统一SkiaSharp相关库版本
你当前混用了跨大版本的SkiaSharp库:SkiaSharp v2.88.1-preview.79和SkiaSharp.Svg v1.60.0,版本差异过大是导致方法找不到的核心原因。
- 卸载
SkiaSharp.Svg v1.60.0,改用与当前SkiaSharp主版本匹配的SkiaSharp.Svg预览版(如v2.88.1-preview系列);或者直接使用已安装的Svg.Skia处理SVG,无需同时保留两种SVG处理库。 - 确保所有SkiaSharp相关包(SkiaSharp、SkiaSharp.Views、Svg.Skia)的版本保持兼容,优先选择正式稳定版而非预览版,规避预览版的API兼容性问题。
2. 检查SVG文件的嵌入设置
确认SVG文件的生成操作已设置为Embedded Resource,否则GetManifestResourceStream无法读取到文件。在Rider中右键SVG文件→属性,将生成操作改为Embedded Resource。
3. 验证资源名称正确性
嵌入资源的名称格式为[程序集名称].[文件夹层级].[文件名],可通过以下代码列出所有嵌入资源,确认目标SVG的完整名称:
var assembly = type.GetTypeInfo().Assembly; foreach (var resourceName in assembly.GetManifestResourceNames()) { Console.WriteLine(resourceName); }
将输出的正确资源名称替换到GetManifestResourceStream的参数中,避免因名称拼写或层级错误导致流读取失败。
4. 清理重建项目
- 手动删除所有项目的bin、obj文件夹
- 在Rider中执行
Clean Solution,再执行Rebuild Solution - 重启模拟器,清除旧缓存文件
5. 调整SVG加载代码(若使用Svg.Skia)
如果选择用Svg.Skia处理SVG,可改用以下代码:
using var stream = assembly.GetManifestResourceStream("你的SVG完整资源名称"); var svg = new SKSvg(); svg.Load(stream);
内容的提问来源于stack exchange,提问作者T.Y. Kucuk

