代码之家  ›  专栏  ›  技术社区  ›  Andreas Zita

在Linux上使用SkiaSharep 1.68时发生DllNotFoundException

  •  0
  • Andreas Zita  · 技术社区  · 7 年前

    使用SkiaSharep 1.68.0和。NET Core 2.2,并在尝试对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上有效,在我升级到之前,它在Linux上也有效。NET Core 2.2和最新的SkiaSharep。

    我尝试过按照错误消息中的建议设置LD_DEBUG env变量,但效果不太好。真的不知道该设定什么。尝试了“全部”,但没有得到任何更详细的日志。

    找到一个 thread 这建议安装SkiaSharp。本土资产。Linux作为一种解决方案,但不幸的是,这没有帮助。构建/发布时是否需要以Linux-x64运行时为目标?尝试了不同的组合,但没有发现任何差异。(我正在Linux上通过ssh和putty在Docker文件中使用dotnet cli构建。几乎是由VS:latest生成的默认Docker文件)

    另一个建议是安装 libSkiaSharp.so 手动和 apt-get install libfontconfig1 ,但不幸的是,apt get在Synology DSM上不可用。

    0 回复  |  直到 7 年前
        1
  •  6
  •   vinayak hegde    6 年前

    安装Linux dependency NuGet软件包将解决这个问题 SkiaSharp.NativeAssets.Linux.NoDependencies https://www.nuget.org/packages/SkiaSharp.NativeAssets.Linux.NoDependencies

        2
  •  4
  •   Røye    7 年前

    我也有同样的问题。Linux上的NETCore2.2。

    首先,我安装了NuGet软件包SkiaSharep。本土资产。Linux(您上面提到的),并确保libSkiaSharp。因此,该文件被复制到与其他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文件中吗?