You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SkiaSharp中SKSvg.Load方法抛出MissingMethodException求助

问题:Xamarin项目中SkiaSharp加载SVG时抛出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:06:21