【问题标题】:Type initializer for 'SkiaSharp.SKImageInfo' threw an exception Avalonia“SkiaSharp.SKImageInfo”的类型初始化程序引发异常 Avalonia
【发布时间】:2021-07-29 21:08:28
【问题描述】:

完整的追溯

$ dotnet run avgui.cs
Unhandled exception. System.TypeInitializationException: The type initializer for 'SkiaSharp.SKImageInfo' 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_colortype_get_default_8888()
   at SkiaSharp.SKImageInfo..cctor()
   --- End of inner exception stack trace ---
   at Avalonia.Skia.PlatformRenderInterface..ctor(ISkiaGpu skiaGpu, Nullable`1 maxResourceBytes) in /_/src/Skia/Avalonia.Skia/PlatformRenderInterface.cs:line 27
   at Avalonia.Skia.SkiaPlatform.Initialize(SkiaOptions options) in /_/src/Skia/Avalonia.Skia/SkiaPlatform.cs:line 20
   at Avalonia.SkiaApplicationExtensions.<>c__0`1.<UseSkia>b__0_0() in /_/src/Skia/Avalonia.Skia/SkiaApplicationExtensions.cs:line 20
   at Avalonia.Controls.AppBuilderBase`1.Setup() in /_/src/Avalonia.Controls/AppBuilderBase.cs:line 304
   at Avalonia.Controls.AppBuilderBase`1.SetupWithLifetime(IApplicationLifetime lifetime) in /_/src/Avalonia.Controls/AppBuilderBase.cs:line 179
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime[T](T builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 147
   at gui_av_c.Program.Main(String[] args) in /home/ibrahim/C#/gui_av_c/Program.cs:line 13

avgui.cs

using Avalonia;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;

namespace AvaloniaApplication1
{
    public class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        public void button_Click(object sender, RoutedEventArgs e)
        {
            var button = (Button)sender;
            button.Content = "Hello, Avalonia!";
        }

        private void InitializeComponent()
        {
            AvaloniaXamlLoader.Load(this);
        }
    }
}

这就是我设置gui_av_c 目录的方式。

~/C#$ mkdir gui_av_c
~/C#$ cd gui_av_c/
~/C#/gui_av_c$ dotnet new avalonia.app
The template "Avalonia .NET Core App" was created successfully.

我尝试过的:

$ sudo apt install skia-sharp
$ sudo apt install libskiasharp
$ dotnet add package SkiaSharp.NativeAssets.Linux

libSkiaSharp.so 放入\usr\lib

$ lddtree /usr/lib/libSkiaSharp.so
libSkiaSharp.so => /usr/lib/libSkiaSharp.so (interpreter => none)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2
    libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1
        libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6
            libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16
            libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1
        libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1
        libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
    ld-linux-x86-64.so.2 => /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

我在 Ubuntu 20.04.2

【问题讨论】:

  • lddtree /path/to/libSkiaSharp.so
  • @kekekeks 我用上述命令的输出编辑了问题,如果我再次执行dotnet run agvui.cs 会出现错误

标签: c# skiasharp avaloniaui


【解决方案1】:

您正在使用 snap 中的 .NET SDK。当您使用此类 SDK 运行您的应用程序时,snap 将在沙盒环境中启动您的程序(没有人要求,尤其是对于 SDK 工具,但无论如何它都会这样做),它有自己的根文件系统,而不需要 Avalonia 所需的本机依赖项。您在主系统上安装的任何内容都不会影响所述沙箱。它只是行不通。

从您的系统中清除 snap-installed .NET SDK(最好与 snap 本身一起)并使用来自 https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004- 的说明进行安装:

wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

sudo apt-get update; \
  sudo apt-get install -y apt-transport-https && \
  sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-5.0

【讨论】:

  • 在我从 snap 中删除 dotnet-sdk 并从微软下载后,它给了我这个输出 bash $ dotnet Command 'dotnet' not found, but can be installed with: sudo snap install dotnet-sdk
  • /usr/bin/dotnetdotnet-host 包的一部分。确保它已安装。还要检查which dotnet 的输出,快照安装版本可能有一些剩余物。 Canonical 对他们的 snap 工具进行了大量的推广,因此在每个 Ubuntu 版本中都很难摆脱它(这是我在使用 Ubuntu 10 多年后考虑迁移到 Debian 的原因之一在台式机和服务器上)
  • which dotnet 不提供任何输出以及如何安装 dotnet-host
  • 你确定你已经执行了sudo apt-get install -y dotnet-sdk-5.0吗? dotnet-host 包应该作为依赖安装。
  • nvm 这是一个 PPA 的问题,导致 sudo apt update 出现问题
猜你喜欢
  • 1970-01-01
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2013-05-15
  • 2013-11-08
  • 2019-07-08
  • 2013-10-06
相关资源
最近更新 更多