深度OS Deepin 23 安装 .NET 9 并Avalonia UI 开发Linux桌面程序体验

645 阅读5分钟

一个Java Developer,免不了要兼职、要擦边各类客户端开发,桌面应用程序开发也不例外。遥想当年,我曾是一名.net 程序员,至今仍怀念那些用 WinForm 敲代码的日子。如今,因工作中的种种契机,我的目光再次聚焦到 C# 上,它依旧散发着独特魅力,每一次接触都能让我感受到那份久违的惊艳。

随着信创产业的蓬勃发展,国产操作系统正逐步走入公众视线。Deepin 作为 UOS 的社区版本,客观来讲,堪称国产操作系统中的翘楚。Deepin 23 开发桌面程序首选 Qt5 作为桌面程序的核心开发框架。然而,Qt5 所采用的 LGPL 开源协议,加之其相对较高的学习成本,着实让我们这些仅偶然从事相关开发的程序员还是感到压力不小。

2024年11月13日 · Microsoft 今天正式发布了 .NET 9,号称是迄今为止最高效、最现代、最安全、最智能、性能最高的 .NET 版本。基于dotnet开发,在上述情况下,对我来说乃是首选。

Overview of .NET with workloads, tools, ecosystem, and OS

Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序。它使用自己的渲染引擎绘制UI控件,确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。

所以推出我这篇文章的主角:Deepin 23 + .net 9 + Avalonia UI 11.0.0

  • 准备工作:

俗话说:美不美看大腿🦵,啊呸,先看桌面,精彩纷呈,艳!!!!!

在开始安装 dotnet 9 之前,确保 Deepin 23 系统已经更新到最新版本,这一步非常重要,可以避免在后续安装过程中可能出现的依赖问题。同时,由于 dotnet 9 需要一定的系统资源支持,确保电脑配置能够满足基本要求。

在终端输入系统更行代码:

sudo apt update && sudo apt upgrade -y

  • 安装 .net 9

在Deepin 20+上安装.NET开发环境基本可以参照Debian的安装方式

安装 .NET 之前,请运行以下命令,将 Microsoft 包签名密钥添加到受信任密钥列表,并添加包存储库。

打开终端并运行以下命令

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

安装 .NET SDK,请运行以下命令:

sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-9.0

下载速度感人,等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!等待!!

完成后输入下面命令查看版本

dotnet --version

dotnet new install Avalonia.Templates

官网地址 : avaloniaui.net/

  • 安装Rider 2024.3.3,现在非商用免费了

下载地址是:Rider: The Cross-Platform .NET IDE from JetBrains ,选择linux .tar.gz版本

下载后右键解压缩,解压缩后的文件夹拷贝到主目录,方便清理下载文件夹

打开/JetBrains Rider-2024.3.3/bin目录,双击rider,选择运行

选用免费非商业使用,并登录激活

安装 AvaloniaRider 插件

  • 搭建项目脚手架

打开Rider,右边菜单选择Avalonia.NET MVVM App,MVVMToolkit,我选择了ReactiveUI

创建好项目后,直接点击运行,先看看效果:

  • 创建一个简单的测试

打开/ViewModels/MainWindowViewModel.cs,修改如下:

using ReactiveUI;
using System;

namespace Learn.FirstDemo.ViewModels;

public class MainWindowViewModel : ViewModelBase
{
    public MainWindowViewModel()
    {
        this.WhenAnyValue(o => o.Name)
            .Subscribe(o => this.RaisePropertyChanged(nameof(Greeting)));
    }

    private string? _name;

    public string? Name
    {
        get => _name;
        set => this.RaiseAndSetIfChanged(ref _name, value);
    }
    
    public string Greeting
    {
        get
        {
            if (string.IsNullOrEmpty(Name))
            {
                // If no Name is provided, use a default Greeting
                return "Hello World from FirstDemo";            }
            else
            {
                // else Greet the User.
                return $"Hello {Name}";
            }
        }
    }
}

打开/Views/MainWindow.axaml,修改如下

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:Learn.FirstDemo.ViewModels"
        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="Learn.FirstDemo.Views.MainWindow"
        x:DataType="vm:MainWindowViewModel"
        Icon="/Assets/avalonia-logo.ico"
        Title="Learn.FirstDemo">

    <Design.DataContext>
        <!-- This only sets the DataContext for the previewer in an IDE,
             to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
        <vm:MainWindowViewModel />
    </Design.DataContext>

    <StackPanel Margin="40">
        <TextBlock>输入你的名字:</TextBlock>
        <TextBox Text="{Binding Name}" />
        <TextBox Text="{Binding Greeting, Mode=OneWay}"
                 IsReadOnly="True"
                 FontWeight="Bold" />
    </StackPanel>
</Window>

点击运行,查看效果

  • 发布与运行

右键点击解决方案,选择发布,本地文件夹

配置发布参数如下,点击运行

发布后的文件位于项目文件夹bin目录之下

最后,发布程序通过命令行可以打包各平台的可以执行包,包括单文件的linux deb包,留给各位自行尝试。