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# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...
随机推荐
- CentOS7.5上FTP服务的安装与使用
1.FTP简介 1.1FTP:File Transfer Protocol 文件传输协议 FTP是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式.它属于网络传输协议的应用层.文件传送(f ...
- 教妹子用IDEA创建web应用,部署到Tomcat服务器
自从上一篇原创发表之后,粉丝反应热烈.主要分两派,一派关注技术的,觉得看了那么多的公众号文章,终于找到一篇能看懂的了,于是沾沾自喜.另一派是关注妹子的,感叹自己空有一身绝技,公司里却无妹子可教,大喊可 ...
- 【JDK】ArrayList集合 源码阅读
这是博主第二次读ArrayList 源码,第一次是在很久之前了,当时读起来有些费劲,记得那时候HashMap的源码还是哈希表+链表的数据结构. 时隔多年,再次阅读起来ArrayList感觉还蛮简单的, ...
- Java8新特性——lambda表达式.(案例:完全数分类)
需求:输入一个数,判断其类型(完全数,过剩数,不足数) 完全数:自身之外所有因数和==自身 过剩数:自身之外所有因数和>自身 不足数:自身之外所有因数和<自身 package cn._3. ...
- maven的私服私包镜像地址配置settings.xml
新建一个setting节点——镜像标签 <mirror> 添加你的mirror_id,name,url是该镜像的信息,一般都没有什么问题. mirrorOf是被镜像的服务器的id,可以是 ...
- 经典Java笔试面试题
面向对象编程(OOP) Java是一个支持并发.基于类和面向对象的计算机编程语言.下面列出了面向对象软件开发的优点: 代码开发模块化,更易维护和修改. 代码复用. 增强代码的可靠性和灵活性. 增加代码 ...
- Springboot 连接 使用 Redis Example
通过一个简单的例子使用Springboot 连接并使用Redis. 本文假设已经安装好Redis. 1.首先将URL转换为一个ID ,并使用 StringRedisTemplate 将ID 和 URL ...
- K-近邻算法介绍与代码实现
声明:如需转载请先联系我. 最近学习了k近邻算法,在这里进行了总结. KNN介绍 k近邻法(k-nearest neighbors)是由Cover和Hart于1968年提出的,它是懒惰学习(lazy ...
- Python将pyc转为py
安装pip install uncompyle2, 使用uncompyle2 xxx.pyc > xxx.py
- Mac上使用ssh连接服务器title显示服务器的ip
Mac上使用ssh连接服务器title显示服务器的ip 使用Mac开发时,管理的服务器过多时,会搞混乱.可能有时啪啪啪一顿操作,最后发现操作错了机器. 解决方案 在远程服务器上,编辑vim /etc/ ...