我创建了一个新的 MAUI .NET 8 项目并迁移了 Xamarin forms 项目代码。 加载 SVG 图像时,我遇到如下异常,
Unhandled Exception:
System.MissingMethodException: Method not found: SkiaSharp.SKMatrix SkiaSharp.SKMatrix.MakeTranslation(single,single)
at SkiaSharp.Extended.Svg.SKSvg.LoadElements(IEnumerable`1 elements, SKCanvas canvas, SKPaint stroke, SKPaint fill)
at SkiaSharp.Extended.Svg.SKSvg.Load(XDocument xdoc)
at SkiaSharp.Extended.Svg.SKSvg.Load(XmlReader reader)
at SkiaSharp.Extended.Svg.SKSvg.Load(Stream stream)
at SKM_MOBILE.UI.Core.Utils.CommonUtils.GetSVG(String svgName, Boolean isEnergized, Boolean inService, String imagePath)
at SkiaSharp.Views.Maui.Controls.SKCanvasView.OnPaintSurface(SKPaintSurfaceEventArgs e)
at SkiaSharp.Views.Maui.Controls.SKCanvasView.SkiaSharp.Views.Maui.ISKCanvasView.OnPaintSurface(SKPaintSurfaceEventArgs e)
at SkiaSharp.Views.Maui.Handlers.SKCanvasViewHandler.OnPaintSurface(Object sender, SKPaintSurfaceEventArgs e)
at SkiaSharp.Views.iOS.SKCanvasView.OnPaintSurface(SKPaintSurfaceEventArgs e)
at SkiaSharp.Views.iOS.SKCanvasView.Draw(CGRect rect)
at UIKit.UIApplication.UIApplicationMain(Int32 args, String[] argv, IntPtr principalClassName, IntPtr delegateClassName) in /Users/builder/azdo/_work/1/s/xamarin-macios/src/UIKit/UIApplication.cs:line 58
at UIKit.UIApplication.Main(String[] args, Type principalClass, Type delegateClass) in /Users/builder/azdo/_work/1/s/xamarin-macios/src/UIKit/UIApplication.cs:line 94
at SKM_MOBILE.Program.Main(String[] args) in /Users/macmini3/Documents/MAUI/SKM_MOBILE/SKM_MOBILE/Platforms/iOS/Program.cs:line 13
这是我的代码,
svg.Load(流);抛出此异常。
using (var stream = GetImageStream(svgName.Replace(".PNG", ".svg").Replace(".png", ".svg"), imagePath))
{
if (stream != null)
{
svg = new SkiaSharp.Extended.Svg.SKSvg();
svg.Load(stream);
SVGComponentImage[$"{key}"] = svg;
}
}
如何解决这个问题?
SkiaSharp 在避免重大更改方面并不是最好的。在当前版本中没有
SKMatrix.MakeTranslation
方法,因为它在某些时候已重命名为 CreateTranslation
。对于某些版本,旧的 MakeTranslation
作为过时的方法存在(文档仍然包含它),但后来他们完全删除了它。
您的一个项目(可能是来自 Xamarin 的原始项目)仍然可能引用旧版本的 SkiaSharp 包,但如果您在至少一个项目中引用它的较新版本,则最终将使用较新的 .dll。因此,请确保在各处使用相同的版本(如果您使用 Visual Studio,“管理 NuGet 引用”窗口中的“协调”选项卡可能会有所帮助)。
如果旧版本被您使用的较旧的第 3 方软件包间接引用(也许
SKM_MOBILE.UI.Core
项目引用了较旧的 SkiaSharp.Extended
软件包,用 MakeTranslation
引用旧的 SkiaSharp 版本?),那么您可能需要升级该软件包(如果有更新版本),或者您可以尝试降级项目中的直接 SkiaSharp 软件包引用。
通常,如果较新的 SkiaSharp 版本至少与以前的版本具有二进制兼容性,则不会发生这种 DLL 地狱。他们不应该实际删除过时的成员,而应该只是从 IntelliSense 中隐藏它们(例如,通过
EditorBrowsableAttribute
)。如果上述选项不适合您(例如,两个 3rd 方软件包引用了不同的不兼容版本,并且没有一个可以满足),那么我建议在 SkiaSharp repo 中提交问题以恢复 中过时的成员下一个版本,这样每个使用旧参考的包都可以再次高兴起来。