在 Linux 上使用 SkiaSharp 1.68 的 DllNotFoundException
DllNotFoundException using SkiaSharp 1.68 on Linux
在 Linux 上将 SkiaSharp 1.68.0 与 .NET Core 2.2 结合使用,并在尝试对 jpeg-memory-stream 使用解码时出现此错误(相同的代码适用于 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)
最里面的错误消息似乎是 "No such file or directory",这很奇怪,因为我正在解码内存流。这在 Windows 上有效,在我升级到 .NET Core 2.2 和最新的 SkiaSharp 之前它在 Linux 上有效。
我已尝试按照错误消息中的建议设置 LD_DEBUG env 变量,但效果不大。不确定真正将其设置为什么。已尝试 'all',但没有产生任何更详细的日志。
找到一个 thread 建议安装 SkiaSharp.NativeAssets.Linux 作为解决方案,但不幸的是这没有帮助。当 building/publishing 时,我是否需要以 Linux-x64 运行时为目标?尝试了不同的组合,但无法检测到任何差异。 (我正在使用 putty 通过 ssh 在 Linux 上的 Docker 文件中使用 dotnet cli 进行构建。几乎由 VS:latest 生成的默认 Docker 文件)
另一个建议是手动安装 libSkiaSharp.so
和 apt-get install libfontconfig1
,但遗憾的是 apt-get 在 Synology DSM 上不可用。
我在 Linux 上遇到了同样的问题 运行 SkiaSharp 和 .Net Core 2.2。
首先,我安装了 NuGet 包 SkiaSharp.NativeAssets.Linux(您在上面提到的)并确保 libSkiaSharp.so 文件被复制到与其余 DLL 相同的目录中。
我仍然收到错误。
接下来,我将 shell 连接到我的容器,并使用以下命令列出依赖项:
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 文件中吗?
安装 Linux 依赖 NuGet 包将解决这个问题
SkiaSharp.NativeAssets.Linux.NoDependencies
https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux.NoDependencies
在 Linux 上将 SkiaSharp 1.68.0 与 .NET Core 2.2 结合使用,并在尝试对 jpeg-memory-stream 使用解码时出现此错误(相同的代码适用于 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)
最里面的错误消息似乎是 "No such file or directory",这很奇怪,因为我正在解码内存流。这在 Windows 上有效,在我升级到 .NET Core 2.2 和最新的 SkiaSharp 之前它在 Linux 上有效。
我已尝试按照错误消息中的建议设置 LD_DEBUG env 变量,但效果不大。不确定真正将其设置为什么。已尝试 'all',但没有产生任何更详细的日志。
找到一个 thread 建议安装 SkiaSharp.NativeAssets.Linux 作为解决方案,但不幸的是这没有帮助。当 building/publishing 时,我是否需要以 Linux-x64 运行时为目标?尝试了不同的组合,但无法检测到任何差异。 (我正在使用 putty 通过 ssh 在 Linux 上的 Docker 文件中使用 dotnet cli 进行构建。几乎由 VS:latest 生成的默认 Docker 文件)
另一个建议是手动安装 libSkiaSharp.so
和 apt-get install libfontconfig1
,但遗憾的是 apt-get 在 Synology DSM 上不可用。
我在 Linux 上遇到了同样的问题 运行 SkiaSharp 和 .Net Core 2.2。
首先,我安装了 NuGet 包 SkiaSharp.NativeAssets.Linux(您在上面提到的)并确保 libSkiaSharp.so 文件被复制到与其余 DLL 相同的目录中。
我仍然收到错误。
接下来,我将 shell 连接到我的容器,并使用以下命令列出依赖项:
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 文件中吗?
安装 Linux 依赖 NuGet 包将解决这个问题
SkiaSharp.NativeAssets.Linux.NoDependencies
https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux.NoDependencies