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为例,发布至不同平台的关键配置如下:
- 配置:主要区分Debug和Release
- 目标框架:支持.NET Standard 2.0的都可以。
- 部署模式:选择“独立”可以直接运行,不用另外安装运行时环境;选择“依赖”还需要提前安装运行时环境
- 目标运行时:需要根据操作系统类型和硬件架构(主要是CPU架构)进行选择
- 生成单个文件:勾选“生成单个文件”,发布时所有的DLL类库都会打包到一个可执行文件里
发布至测试环境(统信UOS、AMD处理器,所以选择linux-x64)如下:
运行效果如下:
附.国产CPU指令集路线
国产CPU | 指令集 |
---|---|
龙芯 | MIPS |
海光 | x86 |
兆芯 | x86 |
飞腾 | arm |
鲲鹏 | arm |
申威 | Alpha |
其中龙芯是完全自主的指令集,前段时间也刚刚更新了对.Net Core的支持;x86主要是生态好,传统桌面处理器intel、AMD都是x86架构,做兼容适配也方便些;arm以前移动端较多,现在桌面端也逐渐赶上。文章来源:https://www.toymoban.com/news/detail-471697.html
上一篇运行环境还是.NET 5.0,结果一看官方文档几天前已经停止支持了,随即卸了VS2019,换上VS2022,也打算看看.NET 7.0中发布的MAUI怎么样。最近.NET版本更新的实在快,感觉快跟不上了,要继续努力啊。文章来源地址https://www.toymoban.com/news/detail-471697.html
到了这里,关于Avalonia学习实践(二)--跨平台支持及发布的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!