在树莓派RaspiOS Lite上运行Avalonia应用

1、设置树莓派

1.1、安装运行库

在 Raspbian Lite 上运行 Avalonia 应用所需的一些库:

apt install libgbm1 libgl1-mesa-dri libegl1-mesa libinput10

可以使用工具 kmscube 来验证 DRM

# 安装
apt install kmscube
# 运行
kmscube

应该在树莓派屏幕上看到旋转的立方体

1.2、安装dotnet8

wget https://download.visualstudio.microsoft.com/download/pr/aed2eece-af6d-42e6-8683-21e7835b7479/786b4f225591440a741c1702407fb7b3/dotnet-sdk-8.0.203-linux-arm64.tar.gz -O dotnet-sdk.tar.gz

mkdir -p /opt/dotnet/8.0
pv dotnet-sdk.tar.gz | tar -C /opt/dotnet/8.0 -zxf -
rm dotnet-sdk.tar.gz
ln -s /opt/dotnet/8.0/dotnet /usr/local/bin
echo "export DOTNET_ROOT=/opt/dotnet/8.0" >> /etc/profile
echo "export PATH=\$PATH:\$DOTNET_ROOT" >> /etc/profile
source /etc/profile

2、准备Avalonia应用

2.1、创建应用

创建新的Avalonia MVVM应用,在本教程中,我们称其为 AvaloniaDrm

添加包 Avalonia.LinuxFrameBuffer

2.2、创建MainView

当我们通过 FrameBuffer 工作时,没有窗口,因此我们需要一个单独的视图(UserControl),它将是我们的顶级控件。该视图是普通窗口的对应物。

MainView 将是我们开发 UI 的应用基础,在Views文件夹下创建:

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="AvaloniaDrm.Views.MainView">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="30" Spacing="30">
        <TextBlock FontSize="25" Text="Welcome to Avalonia !" />
        <Slider />
    </StackPanel>
</UserControl>

现在创建一个名为 MainSingleView 的新 UserControl,并托管 MainView

<UserControl xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:views="clr-namespace:AvaloniaDrm.Views"
             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
             x:Class="AvaloniaDrm.Views.MainSingleView">
    <views:MainView />
</UserControl>

还要更改 MainWindow.axaml 以在其中托管 MainView

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:views="clr-namespace:AvaloniaDrm.Views"
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="AvaloniaDrm.Views.MainWindow"
        Icon="/Assets/avalonia-logo.ico"
        Title="AvaloniaDrm">
    <views:MainView />
</Window>

正如您所看到的,MainViewMainSingleViewMainWindow 中都被托管。这使得开发时在桌面和树莓派上运行应用程序变得更加容易。

2.3、准备 Program.cs

接下来,我们需要准备 Program.cs 以启用DRM的使用。 将 Main 方法更改为以下内容:

internal sealed class Program
{
    [STAThread]
    public static int Main(string[] args)
    {
        var builder = BuildAvaloniaApp();
        if (args.Contains("--drm"))
        {
            return builder.StartLinuxDrm(args, "/dev/dri/card1", 1.0);
        }

        return builder.StartWithClassicDesktopLifetime(args);
    }

    public static AppBuilder BuildAvaloniaApp()
        => AppBuilder.Configure<App>()
            .UsePlatformDetect()
            .WithInterFont()
            .LogToTrace();
}

2.4、准备 App.axaml.cs

App.axaml.cs 中更改 OnFrameworkInitializationCompleted()

public override void OnFrameworkInitializationCompleted()
{
    if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
    {
        desktop.MainWindow = new MainWindow();
    }
    else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView)
    {
        singleView.MainView = new MainSingleView();
    } 

    base.OnFrameworkInitializationCompleted();
}

3、在树莓派上运行

发布程序,将目标运行时配置为linux-arm64,选中生成单个文件,将生成AvaloniaDrmlibHarfBuzzSharp.solibSkiaSharp.so,将这些文件传送到树莓派上。(也可以在发布配置文件中添加<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>这样可以将Native库包含到一个文件中)

为程序文件添加执行权限

chmod +x AvaloniaDrm

现在,可以运行程序

./AvaloniaDrm --drm

4、参考链接

在树莓派上通过 Raspbian Lite 运行 | Avalonia Docs (avaloniaui.net)

c# – Error when trying to run Avalonia through DRM in raspberry pi 4 – Stack Overflow

5、补充

如果在x86架构的设备上使用,可能还需要安装 libfontconfig1

apt install libfontconfig1
上一篇
下一篇