在Linux上使用SkiaSharp 1.68的DllNotFoundException

时间:2018-12-09 13:53:01

标签: .net-core skiasharp

在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。

2 个答案:

答案 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