NetCore跨平台桌面框架Avalonia的OSX程序打包
虽然工作开发语言已经转到了java,但平时仍会用netcore做一些小工具,提升工作效率,但是笔记本换成了Mac,小工具只能做成命令行形式,很是痛苦,迫切需要一个.net跨平台的桌面程序解决方案。
为什么选择Avalonia
据我所知目前有几个.net跨平台桌面解决方案,如 Electron.NET、Xamarin、Eto.Forms和Avalonia,并对这几个框架进行了一定的尝试。
Electron.NET使用Electron作为前端展示,NetCore作为后台服务,前端可以把一些耗时操作提交给后端处理,但是打包后的程序在OSX启动,每次都会弹出要开启xxxx端口,相对来说不够友好,况且我对js和css比较无感,windows桌面开发经验无法得到利用。
Xamarin新版已经统一了android和ios的代码,除了极少用到各平台特定功能,基本上可以同一套代码编译出两个不同平台版本的程序包,但桌面端还无法使用同一套代码编译进行多平台编译。
Eto.Forms 采用了原生控件映射的方式,可以实现一套代码编译出OSX/Linux/Windows三个平台的程序,采用mono运行时,但现在vs插件只有vs2017的,没有vs2019
Avalonia 采用基于了WPF Xaml,对于有WPF/UWP/Xamarin.Forms开发经验的人来说,极易入手,虽然目前仍处在测试阶段(几年前就这么说了),但已经可以使用该框架编写应用程序,最大的优点是, 程序采用了.NetCore 运行时,所以使用dotnet publish跨平台发布,就可以在单平台下编译出适合多个平台的应用程序。
开发准备
1 对于使用Visual Studio 2017/2019的人来说,可以直接通过VS的Marketplace安装Avalonia扩展,或者直接通过 此链接 下载后安装(此扩展不支持Visual Studio for Mac)

2 对于没有Visual Studio或者在非Windows平台上开发的人来说,可以使用.NetCore CLI安装Avalonia项目模板
a) 克隆项目模板库到本地
git clone https://github.com/AvaloniaUI/avalonia-dotnet-templates.git
b) 安装模板库
dotnet new -i [模板库存放的本地路径]

安装完成后可以看到

创建Avalonia项目程序
接下来以Visual Studio 2019



虽然第二步选择了 .NetFramework 4.7.2版本,但是目标框架仍是 .NetCoreApp2.1和NetFramework 4.6.1, 项目的目录结构,和WPF很相似
等待Nuget还原成功后,先构建一下项目,VS上可以直接像WPF一样所见即所得地使用设计器
修改一下MainWindow的界面代码以及后端代码,此处只给出与模板生成代码的git差异


看到DockPanel是不是有很熟悉的感觉?
在界面代码中,我对<Window>添加了 Width和Height的默认属性,在Windows系统下,这两个属性可以不用添加,程序启动后是正常的,但如果运行于OSX系统,不添加默认宽高,窗口会很小(虽然可以通过拖动来缩放)
调试运行
直接从VS进行调试运行,先跳出一个dotnet窗口,再跳出一个界面窗口,可见程序是运行在.NetCore运行时上的

点击按钮,如我所愿,显示了“Welcome to Avalonia!”

发布程序
我的目标是将程序发布到OSX平台
先运行 dotnet publish
发生了错误,提示项目是多目标框架的,需要指定发布目标框架
运行 dotnet publish -f=netcoreapp2.1
指定目标框架为 netcoreapp2.1,提示 error MSB1009:项目文件不存在
还是不行,那再试试发布到.net framework 4.6.1
dotnet publish -f=net461
发布成功

疑惑为什么无法发布到netcoreapp2.1下为什么会失败,所以我使用 .NetCore CLI创建了一个项目,对比两项目的 .csproj文件发现
使用.NetCore CLI创建的项目文件,使用的是单目标框架,而使用VS模板创建的项目文件,是多目标框架,
对比两个文件,对 .csproj文件进行修改,将项目更改为单目标框架 netcoreapp2.1

删除项目下的 bin 和 obj 文件夹, 并指定OSX平台发布
dotnet publish -r osx-x64
生成成功

将 \bin\Debug\netcoreapp2.1\osx-x64\publish 目录拷到 OSX 下(如果打包后复制,在OSX解压会丢失文件的权限属性,没有执行权限,需要重新授权)

通过命令行运行 MyAvalonia 程序,

程序窗口正常跳出

点击按钮

程序打包
成功了但不够完美,有没有办法打包成.app应用,直接点击就可以运行?
Google了很久,网上没有找到现成的打包工具,那就自己想想办法
使用Xcode创建了一个 Cocoa App, 项目名称可任意取(我取名为avalonia),直接build,生成一个 avalonia.app 文件,将 .app文件拷出,查看程序包结构

把 avaloina.app/Contents/MacOS 下所有文件(只有avalonia文件) 删除
把avaloina.app/Contents/Frameworks 下所有文件(很多 .dylib 文件)删除
把自己编译的程序 publish/ 下所有文件,拷贝到 avaloina.app/Contents/MacOS下

使用文本编辑器打开 avaloina.app/Contents/Info.plist,修改 CFBundleExecutable 对应的 String值, 从 avalonia 改为 MyAvalonia, 保存


直接点击运行 avalonia.app,成功出现MyAvalonia窗口界面。
NetCore跨平台桌面框架Avalonia的OSX程序打包的更多相关文章
- 造轮子了!NETCore跨平台UI框架,CPF
CPF(暂时命名)(Cross platform framework),模仿WPF的框架,支持NETCore的跨平台UI框架,暂时不够完善,只用于测试,暂时只支持Windows和Mac.支持数据绑定, ...
- 干!垃圾微软!发布我的Netcore跨平台UI框架 CPF
什么鬼,我的CPF快写好了,你居然也要搞跨平台UI框架?什么Maui? 之前怎么不早说要搞跨平台UI框架呢?看到谷歌搞flutter眼红了?明年年底发布?又搞这种追别人屁股的烂事情. 什么MVU模式? ...
- .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。
介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...
- xms跨平台基础框架 - 基于.netcore
背景 敝人经过多年开发,数百个项目“打磨(折磨)”,各种国内外框架平台都有涉及,没有一款称心顺手的,原因有三,一是设计反人类,二是不开源根本无法突破框架限制,三是即使开源也是阉割版,然后xms就开始萌 ...
- .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了
上一章回顾: .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...
- Electron开发跨平台桌面程序入门教程
最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...
- .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架
系列目录 [已更新最新开发文章,点击查看详细] .NET Core 实现了跨平台,支持在 Windwos.Linux.macOS上开发与部署,但是也仅限于Web应用程序.对于Windows桌面 ...
- .NET 跨平台界面框架和为什么你首先要考虑再三
原文地址 现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统 ...
- 【译】.NET 跨平台界面框架和为什么你首先要考虑再三
现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...
随机推荐
- php实现redis锁机制
<?php class Redis_lock { public static function getRedis() { $redis = new redis(); $redis->con ...
- yii框架widget和注册asset的例子
yii框架是一个基于组件的框架,这样代码的重用性就非常的高,如我们想在网站的多个地方调用编辑器,这样我们就可以自定义一个组件,来供我们调用使用 下面以Ueditor组件为例: 1.下载ueditor到 ...
- 安装mysql apache php smb
1 SMB LinuX下SMB的配置 使用Smb进行连接的命令: smbclient //192.168.128.1/Share 今天要在LINUX之间以及LINUX与WINDOWS之间互相传送文件, ...
- ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览
在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...
- logrotate切割nginx日志
1 配置 使用系统自带的logrorate来切个nginx日志,位于/usr/sbin/logrotate 假设服务器上有两个网站的nginx配置分别如下: 去除其它配置信息,只保留了日志相关 A网站 ...
- BFS(一):广度优先搜索的基本思想
广度优先搜索BFS(Breadth First Search)也称为宽度优先搜索,它是一种先生成的结点先扩展的策略. 在广度优先搜索算法中,解答树上结点的扩展是按它们在树中的层次进行的.首先生成第一层 ...
- 02-三种Bean装配机制(三)
在前两篇中分别介绍了自动化装配机制和通过JavaConfig类进行装配,接下来介绍下通过XML装配bean,其实就目前趋势来看,这种方式用的越来越少(不是我说的,是作者说的,喜欢这种方式的别喷我
- Linux下无法执行tree命令问题
Linux下不能使用tree命令,是因为没有安装命令, 执行下面代码就行了 yum install tree -y
- 什么是JS跨域请求
这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...
- 我把代码开源、托管到了GitHub、码云
前言 学习了那么多知识点,写了那么多代码,一直都没有时间整理,之前都是新学一个知识点就在同一个工程项目中进行实践测试,导致这个工程越来越臃肿.越来越乱,连我自己都快看不懂了... 这段时间整理了部分代 ...