在Linux上使用SkiaSharp 1.68时出现了DllNotFoundException问题

9

在Linux上使用SkiaSharp 1.68.0和.NET Core 2.2,在尝试使用Decode解码jpeg内存流时出现错误(相同的代码在Windows上运行正常):

System.TypeInitializationException: The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception. ---> System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory
   at SkiaSharp.SkiaApi.sk_managedstream_set_delegates(IntPtr pRead, IntPtr pPeek, IntPtr pIsAtEnd, IntPtr pHasPosition, IntPtr pHasLength, IntPtr pRewind, IntPtr pGetPosition, IntPtr pSeek, IntPtr pMove, IntPtr pGetLength, IntPtr pCreateNew, IntPtr pDestroy)
   at SkiaSharp.SKAbstractManagedStream..cctor()
   --- End of inner exception stack trace ---
   at SkiaSharp.SKAbstractManagedStream..ctor(Boolean owns)
   at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream, Boolean owns)
   at SkiaSharp.SKManagedStream..ctor(Stream managedStream, Boolean disposeManagedStream)
   at SkiaSharp.SKCodec.WrapManagedStream(Stream stream)
   at SkiaSharp.SKCodec.Create(Stream stream, SKCodecResult& result)
   at SkiaSharp.SKCodec.Create(Stream stream)
   at SkiaSharp.SKBitmap.Decode(Stream stream) 

内部错误信息似乎是“没有这样的文件或目录”,这很奇怪,因为我正在解码内存流。这在Windows上有效,在升级到.NET Core 2.2和最新的SkiaSharp之前,它也在Linux上运行过。
我尝试设置LD_DEBUG环境变量,如错误消息中建议的那样,但没有什么作用。不确定应该设置什么。尝试了“all”,但没有更详细的日志结果。
找到一个thread,建议安装SkiaSharp.NativeAssets.Linux作为解决方案,但不幸的是这并没有帮助。我需要针对Linux-x64 runtime进行构建/发布吗?尝试了不同的组合,但没有发现任何区别。(我在通过putty的Linux上使用dotnet cli在Docker-file中构建,几乎是由VS:latest生成的默认Docker-file)
另一个建议是手动安装libSkiaSharp.so和apt-get install libfontconfig1,但不幸的是Synology DSM上没有apt-get。
2个回答

12

9

我曾经在Linux上使用.Net Core 2.2运行SkiaSharp时遇到过同样的问题。

首先,我安装了你提到的NuGet包SkiaSharp.NativeAssets.Linux,并确保libSkiaSharp.so文件被复制到与其余DLL文件相同的目录中。

然而,我仍然收到了错误信息。

接下来,我连接到容器并使用命令列出了其依赖项: ldd libSkiaSharp.so

我发现我的环境缺少libfreetype6libfontconfig1

由于我的环境使用Docker,因此我只需在docker文件中添加一些命令以安装这些额外的依赖项:

FROM microsoft/dotnet:aspnetcore-runtime RUN apt-get update RUN apt-get install -y libfreetype6 RUN apt-get install -y libfontconfig1

现在应用程序可以正常运行。

请尝试将这些命令添加到您的Docker文件中吗?


感谢您提供的解决方案。您说:“并确保将libSkiaSharp.so文件复制到与其余DLL文件相同的目录中”,我不知道是否需要额外的步骤来实现这一点,但是实际上文件最终只是出现在它们应该出现的位置。 - GeekyMonkey
1
我曾经遇到过类似的问题,并且使用了相似的解决方案。我测试了它,发现两个步骤都是必需的,单独执行其中一个并不能解决问题。在我的情况下,只需要使用apt-get安装libfontconfig1就足够了,我不需要安装其他库。 - Vesa Vainio
FYI:SkiaSharp有一个新版本,没有任何依赖关系,也可以在Synology上很好地工作,而无需安装任何字体库(可用于调整图像大小,但不支持文本呈现)。 - Andreas Zita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接