“SkiaSharp.SKImageInfo”的类型初始值设定项引发异常 Avalonia

问题描述

完整回溯

$ 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

解决方法

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

从您的系统中清除 snap-installed .NET SDK(最好与 snap 本身一起)并使用 {{3}} 中的说明进行安装:

from selenium import webdriver
from bs4 import BeautifulSoup as soup
import urllib.parse,collections,re
d = webdriver.Chrome('/path/to/chromedriver')
d.get((url:='https://www.capology.com/club/leicester/salaries/2019-2020/'))
league_teams = d.execute_script("""
    var results = [];
    for (var i of Array.from(document.querySelectorAll('li.green-subheader + li')).slice(0,5)){
        results.push({league:i.querySelector('.league-title').textContent,teams:Array.from(i.querySelectorAll('select:nth-of-type(1).team-menu option')).map(x => [x.getAttribute('value'),x.textContent]).slice(1),years:Array.from(i.querySelectorAll('select:nth-of-type(2).team-menu option')).map(x => [x.getAttribute('value'),x.textContent]).slice(2)})
    }
    return results;
""")
vals = collections.defaultdict(dict)
for i in league_teams:
   for y,full_year in [[re.sub('\d{4}\-\d{4}','2020-2021',i['years'][0][0]),'2020-21'],*i['years']][:4]:
      for t,team in i['teams']:
          d.get(urllib.parse.urljoin(url,t) + (y1:=re.findall('/\d{4}\-\d{4}/',y)[0][1:]))
          hvals = [x.get_text(strip=True) for x in soup(d.page_source,'html.parser').select('#table thead tr:nth-of-type(3) th')]
          tvals = soup(d.page_source,'html.parser').select('#table tbody tr')
          full_table = [dict(zip(hvals,[j.get_text(strip=True) for j in k.select('td')])) for k in tvals]
          if team not in vals[i['league']]:
             vals[i['league']][team] = {full_year:None}
          vals[i['league']][team][full_year] = full_table