在Linux上将SkiaSharp 1.68.0与.NET Core 2.2结合使用,并尝试在jpeg内存流上使用Decode(在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 env变量,但这并没有太大作用。不知道将其设置为真的。尝试了“全部”,但没有得到更详细的日志。
找到了一个thread,建议安装SkiaSharp.NativeAssets.Linux作为解决方案,但不幸的是,这样做没有帮助。构建/发布时是否需要针对Linux-x64运行时?尝试过不同的组合,但无法发现任何差异。 (我使用dotnet cli在Linux上的Docker文件中通过腻子在ssh上构建。相当多的默认Docker文件由VS:latest生成)
另一建议是手动安装libSkiaSharp.so
,也手动安装apt-get install libfontconfig1
,但很遗憾,Synology DSM上不提供apt-get。
答案 0 :(得分:1)
在Linux上使用.Net Core 2.2运行SkiaSharp时,我遇到了同样的问题。
首先,我安装了NuGet软件包SkiaSharp.NativeAssets.Linux(您在上面提到过),并确保将libSkiaSharp.so文件复制到与其他DLL相同的目录中。
我仍然收到错误消息。
接下来,我将外壳连接到容器,并使用以下命令列出了依赖项:
ldd libSkiaSharp.so
我发现我缺少 libfreetype6 和 libfontconfig1 。
当我的环境使用Docker时,我只是添加了一些命令以在Docker文件中安装这些额外的依赖项:
FROM microsoft/dotnet:aspnetcore-runtime
RUN apt-get update
RUN apt-get install -y libfreetype6
RUN apt-get install -y libfontconfig1
现在该应用程序可以工作了。
您可以尝试将这些命令添加到Docker文件中吗?
答案 1 :(得分:1)
安装Linux依赖项NuGet软件包将解决此问题
SkiaSharp.NativeAssets.Linux.NoDependencies
https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux.NoDependencies