Avalonia学习实践(二)--跨平台支持及发布

Avalonia主打跨平台,号称一套代码支持Windows, macOS, Linux, iOS, Android操作系统,其基础是基于.NET Standard 2.0的一系列库,也就是只要平台能支持.NET Standard 2.0,就能运行Avalonia开发的应用。然而理想很丰满、现实很骨感,并不是说跨平台Avalonia没有做到,而是过程中免不了会有些小问题。


1.支持的平台

运行平台 版本
Windows Windows8及其以上版本(Window7也能用,但不保证没问题)
MacOS MacOS High Serra 10.13及其以上版本(没用过苹果,也没有开发的需求,就不详细研究了)
Linux Debian 9、Ubuntu 16.5、Fedora 30及其以上(主要是各种发行版)

移动端跨平台,也就是iOS和Android的支持后面单讲。
附带了解下使用Linux内核国产操作系统的情况:

操作系统 研制单位 备注
银河麒麟 天津麒麟信息技术有限公司
中标麒麟 中标软件科技有限公司 原中标普华
统信UOS 统信软件科技有限公司
中科方德 中科方德软件有限公司
优麒麟 中国CCN联合实验室 基于Ubuntu发行版

目前接触的比较多的有这几款,其他国产操作系统还有StartOS(原ylmf OS)、SPG思普、共创Linux、深度Linux(Deepin)、红旗Linux、中兴新起点(NewStart)、华为鸿蒙(HarmonyOS)等。这其中麒麟系的、中字头的党政军部门用到多,会有专用版本,操作系统版总体不错,桌面版体验差点,不过都能支持.NET Core跨平台,运行Avalonia应用应该可以;统信UOS的桌面版算是国产里面用起来比较舒服的,尤其是习惯Windows的切换比较顺畅(测试环境用的统信UOS V20家庭版);华为鸿蒙进来势头很猛,定位跟前面几款比不太一样,侧重移动、物联;其他的没用过,不做评价。

2.跨平台的实现

Avalonia实现跨平台的逻辑可以通过应用入口Program.cs的代码了解一下。

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

这是MVVM模式下构建应用的代码,常规模式下是没有UseReactiveUI()这一行的。
重点在于方法UsePlactformDetect(),即运行平台检测,方法实现如下:

public static TAppBuilder UsePlatformDetect<TAppBuilder>(this TAppBuilder builder)
    where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
{
    var os = builder.RuntimePlatform.GetRuntimeInfo().OperatingSystem;

    // We don't have the ability to load every assembly right now, so we are
    // stuck with manual configuration  here
    // Helpers are extracted to separate methods to take the advantage of the fact
    // that CLR doesn't try to load dependencies before referencing method is jitted
    // Additionally, by having a hard reference to each assembly,
    // we verify that the assemblies are in the final .deps.json file
    //  so .NET Core knows where to load the assemblies from,.
    if (os == OperatingSystemType.WinNT)
    {
        LoadWin32(builder);
        LoadSkia(builder);
    }
    else if(os==OperatingSystemType.OSX)
    {
        LoadAvaloniaNative(builder);
        LoadSkia(builder);
    }
    else
    {
        LoadX11(builder);
        LoadSkia(builder);
    }
    return builder;
}

static void LoadAvaloniaNative<TAppBuilder>(TAppBuilder builder)
    where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
     => builder.UseAvaloniaNative();
static void LoadWin32<TAppBuilder>(TAppBuilder builder)
    where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
     => builder.UseWin32();

static void LoadX11<TAppBuilder>(TAppBuilder builder)
    where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
     => builder.UseX11();

static void LoadSkia<TAppBuilder>(TAppBuilder builder)
    where TAppBuilder : AppBuilderBase<TAppBuilder>, new()
     => builder.UseSkia();

逻辑也比较好理解,就是应用启动时,通过运行环境信息获取当前的操作系统类型,根据操作系统类型分别加载不同的UI渲染库。操作系统类型为WinNT(Windows)时,加载Win32和Skia的库;操作系统类型为OSX(MacOS)时,加载AvaloniaNative和Skia的库;其他类型,也就是Linux时,加载X11和Skia的库。

3.发布至不同平台

开发Avalonia应用常用的IDE有VisualStudio和JetBrains Rider,以“宇宙第一IDE”VisualStudio为例,发布至不同平台的关键配置如下:
Avalonia学习实践(二)--跨平台支持及发布_第1张图片

  • 配置:主要区分Debug和Release
  • 目标框架:支持.NET Standard 2.0的都可以。
  • 部署模式:选择“独立”可以直接运行,不用另外安装运行时环境;选择“依赖”还需要提前安装运行时环境
  • 目标运行时:需要根据操作系统类型和硬件架构(主要是CPU架构)进行选择
  • 生成单个文件:勾选“生成单个文件”,发布时所有的DLL类库都会打包到一个可执行文件里

发布至测试环境(统信UOS、AMD处理器,所以选择linux-x64)如下:
Avalonia学习实践(二)--跨平台支持及发布_第2张图片
运行效果如下:

附.国产CPU指令集路线

国产CPU 指令集
龙芯 MIPS
海光 x86
兆芯 x86
飞腾 arm
鲲鹏 arm
申威 Alpha

其中龙芯是完全自主的指令集,前段时间也刚刚更新了对.Net Core的支持;x86主要是生态好,传统桌面处理器intel、AMD都是x86架构,做兼容适配也方便些;arm以前移动端较多,现在桌面端也逐渐赶上。


上一篇运行环境还是.NET 5.0,结果一看官方文档几天前已经停止支持了,随即卸了VS2019,换上VS2022,也打算看看.NET 7.0中发布的MAUI怎么样。最近.NET版本更新的实在快,感觉快跟不上了,要继续努力啊。
Avalonia学习实践(二)--跨平台支持及发布_第3张图片

你可能感兴趣的:(学习实践,.NET,avalonia,跨平台,桌面应用)