赞
踩
Avalonia主打跨平台,号称一套代码支持Windows, macOS, Linux, iOS, Android操作系统,其基础是基于.NET Standard 2.0的一系列库,也就是只要平台能支持.NET Standard 2.0,就能运行Avalonia开发的应用。然而理想很丰满、现实很骨感,并不是说跨平台Avalonia没有做到,而是过程中免不了会有些小问题。
运行平台 | 版本 |
---|---|
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家庭版);华为鸿蒙进来势头很猛,定位跟前面几款比不太一样,侧重移动、物联;其他的没用过,不做评价。
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的库。
开发Avalonia应用常用的IDE有VisualStudio和JetBrains Rider,以“宇宙第一IDE”VisualStudio为例,发布至不同平台的关键配置如下:
发布至测试环境(统信UOS、AMD处理器,所以选择linux-x64)如下:
运行效果如下:
国产CPU | 指令集 |
---|---|
龙芯 | MIPS |
海光 | x86 |
兆芯 | x86 |
飞腾 | arm |
鲲鹏 | arm |
申威 | Alpha |
其中龙芯是完全自主的指令集,前段时间也刚刚更新了对.Net Core的支持;x86主要是生态好,传统桌面处理器intel、AMD都是x86架构,做兼容适配也方便些;arm以前移动端较多,现在桌面端也逐渐赶上。
上一篇运行环境还是.NET 5.0,结果一看官方文档几天前已经停止支持了,随即卸了VS2019,换上VS2022,也打算看看.NET 7.0中发布的MAUI怎么样。最近.NET版本更新的实在快,感觉快跟不上了,要继续努力啊。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。