Xamarin中调用sKSVG.Load(stream)抛出空参数异常如何解决?
问题分析与解决方案
异常产生原因
System.ArgumentNullException: Value cannot be null. Parameter name: input异常的触发原因是传入sKSVG.Load()方法的stream参数为null,stream为空的常见场景如下:
- 资源路径拼接错误:
assembly.Name + ".Images."+ Source拼接得到的资源路径和程序集中实际存储的嵌入式资源路径不匹配,可能是文件名拼写错误、路径大小写不匹配、缺少.svg后缀,或者项目默认命名空间和assembly.Name不一致导致的。 - 资源生成操作配置错误:SVG文件的生成操作没有设置为
嵌入的资源(Embedded Resource),导致资源没有被打包到程序集中,读取时直接返回null。 - 程序集获取错误:读取资源使用的程序集和SVG资源实际所在的程序集不匹配,比如SVG放在共享类库中,但读取时用了平台项目的程序集。
解决方法
- 首先添加空校验与路径调试逻辑,拿到stream后先判断是否为空,同时输出所有已嵌入的资源名称方便核对:
using(Stream stream = typeof(SVGImage).GetTypeInfo().Assembly.GetManifestResourceStream(assembly.Name + ".Images."+ Source)) { // 新增空判断与调试逻辑 if (stream == null) { // 打印当前程序集所有嵌入资源名称,核对路径是否正确 var allResources = typeof(SVGImage).GetTypeInfo().Assembly.GetManifestResourceNames(); foreach (var resName in allResources) { System.Diagnostics.Debug.WriteLine($"已嵌入资源:{resName}"); } throw new FileNotFoundException($"未找到指定SVG资源,尝试读取的路径为:{assembly.Name}.Images.{Source}"); } SkiaSharp.Extended.Svg.SKSvg sKSVG = new SkiaSharp.Extended.Svg.SKSvg(); sKSVG.Load(stream); // 原有渲染逻辑保持不变 SKImageInfo imageInfo = e.Info; sKCanvas.Translate(imageInfo.Width / 2f, imageInfo.Height / 2f); SKRect rectBounds = sKSVG.ViewBox; float xRatio = imageInfo.Width / rectBounds.Width; float yRatio = imageInfo.Height / rectBounds.Height; float minRatio = Math.Min(xRatio, yRatio); sKCanvas.Scale(minRatio); sKCanvas.Translate(-rectBounds.MidX, -rectBounds.MidY); sKCanvas.DrawPicture(sKSVG.Picture); }
- 修正资源配置:选中项目中的SVG文件,右键打开属性面板,确认生成操作设置为
嵌入的资源,复制到输出目录设置为如果较新则复制。 - 修正资源路径:根据调试输出的资源名称,调整拼接规则,确保最终拼接的路径和实际嵌入的资源名称完全一致,注意嵌入式资源路径区分大小写,不要遗漏
.svg后缀。 - 核对程序集:如果SVG资源存放在单独的类库项目中,需要替换读取资源时使用的程序集为资源所在类库的程序集,不要错误使用启动项目的程序集读取。
内容的提问来源于stack exchange,提问作者Amine Bougrine
相关产品推荐
相关产品推荐

