DllNotFoundException с использованием SkiaSharp 1.68 в Linux - PullRequest
0 голосов
/ 09 декабря 2018

Использование SkiaSharp 1.68.0 с .NET Core 2.2 в Linux и получение этой ошибки при попытке использовать декодирование в потоке памяти 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 и последней версии SkiaSharp.

Я попытался установить переменную LD_DEBUG env, как предложено в сообщении об ошибке, но это не помогло.Не уверен, что установить его на самом деле.Пробовал «все», но это не привело к более подробному журналу.

Найден поток , который предлагает установить SkiaSharp.NativeAssets.Linux в качестве решения, но, к сожалению, это не помогло,Нужно ли ориентироваться на среду выполнения Linux-x64 при сборке / публикации?Пробовал разные комбинации, но не смог обнаружить никакой разницы.(Я создаю с помощью dotnet cli в Docker-файле на Linux поверх ssh с putty. Практически по умолчанию Docker-файл, сгенерированный VS: последний)

Другим предложением было установить libSkiaSharp.so вручную, а такжеapt-get install libfontconfig1, но, к сожалению, apt-get недоступен в Synology DSM.

1 Ответ

0 голосов
/ 05 марта 2019

У меня была такая же проблема при запуске SkiaSharp с .Net Core 2.2 в Linux.

Сначала я установил пакет 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?

...