虽然工作开发语言已经转到了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程序打包的更多相关文章

  1. 造轮子了!NETCore跨平台UI框架,CPF

    CPF(暂时命名)(Cross platform framework),模仿WPF的框架,支持NETCore的跨平台UI框架,暂时不够完善,只用于测试,暂时只支持Windows和Mac.支持数据绑定, ...

  2. 干!垃圾微软!发布我的Netcore跨平台UI框架 CPF

    什么鬼,我的CPF快写好了,你居然也要搞跨平台UI框架?什么Maui? 之前怎么不早说要搞跨平台UI框架呢?看到谷歌搞flutter眼红了?明年年底发布?又搞这种追别人屁股的烂事情. 什么MVU模式? ...

  3. .net 跨平台桌面程序 avalonia:从项目创建到打包部署linux-64系统deepin 或 ubuntu。

    介绍: 目前微软还没有跨平台桌面程序的开发框架.github上有一个团队开始自行研发跨平台桌面框架,其中一款叫avalonia.avalonia 采用 Xaml+C#,类似于wpf,可运行于.netf ...

  4. xms跨平台基础框架 - 基于.netcore

    背景 敝人经过多年开发,数百个项目“打磨(折磨)”,各种国内外框架平台都有涉及,没有一款称心顺手的,原因有三,一是设计反人类,二是不开源根本无法突破框架限制,三是即使开源也是阉割版,然后xms就开始萌 ...

  5. .NET 跨平台框架Avalonia UI: 填坑指北(二):在Linux上跑起来了

    上一章回顾:  .NET 跨平台框架Avalonia UI: 填坑指北(一):熟悉UI操作 本篇将要阐述 包括但不仅限于Avalonia及所有Windows到Linux跨平台开发 的一些注意事项: 一 ...

  6. Electron开发跨平台桌面程序入门教程

    最近一直在学习 Electron 开发桌面应用程序,在尝试了 java swing 和 FXjava 后,感叹还是 Electron 开发桌面应用上手最快.我会在这一篇文章中实现一个HelloWord ...

  7. .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架

    系列目录     [已更新最新开发文章,点击查看详细] .NET Core 实现了跨平台,支持在 Windwos.Linux.macOS上开发与部署,但是也仅限于Web应用程序.对于Windows桌面 ...

  8. .NET 跨平台界面框架和为什么你首先要考虑再三

    ​​​原文地址 现在用 C# 来开发​跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统 ...

  9. 【译】.NET 跨平台界面框架和为什么你首先要考虑再三

    现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...

随机推荐

  1. kafka设计原理(转)

    一.kafka简介 1.1 背景历史 当今社会各种应用系统,诸如商业.社交.搜索.浏览等信息工厂一样不断被生产出各种信息,在大数据时代,我们面临如下几个挑战: 如何收集这些巨大的信息 如何分析它 如何 ...

  2. chrome浏览器开发者工具F12中某网站的sources下的源码如何批量保存?

    目录 chrome浏览器 开发者工具F12中某网站的sources下的源码如何批量保存 1. 常用保存Sources源码的两种方法 1.1单个文件 1.2 单个页面 2. 问题 3.解决方案 chro ...

  3. Azkaban —— 编译及部署

    一.Azkaban 源码编译 1.1 下载并解压 Azkaban 在3.0版本之后就不提供对应的安装包,需要自己下载源码进行编译. 下载所需版本的源码,Azkaban的源码托管在GitHub上,地址为 ...

  4. 【JDK基础】java基础的一些资料

    工具:https://blog.csdn.net/javazejian/article/details/72828483 类加载器:https://blog.csdn.net/X5fnncxzq4/a ...

  5. 【工具】读取proprtties工具类

    获取properties内容: 基本的使用看网络上大多是这样的,使用时注意线程安全以及读写的实时性问题. 1.直接通过流读取(反射): InputStream inStream =  this.get ...

  6. 使用redis PSUBSCRIBE实现实时任务

    PSUBSCRIBE可以监听键的过期事件 1.进行数据库的配置 notify-keyspace-events Ex 2.使用命令监听事件 psubscribe  __keyevnet@0__:expi ...

  7. JS中 【“逻辑运算”,“面试题:作用域问题”,“dom对象”】这些问题的意见见解

    1.逻辑运算 ||  &&  ! ||:遇到第一个为true的值就中止并返回 &&:遇到第一个为false的值就中止并返回,如果没有false值,就返回最后一个不是fa ...

  8. PATB 1018. 锤子剪刀布

    时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 大家应该都会玩“锤子剪刀布”的游戏:两人同时给出手势,胜负规则如图 ...

  9. Linux 中文件和文件夹获取 MySQL 权限(SELinux)

    今天在 Linux 系统上移动 MySQL 的数据库目录 配置如下: /etc/my.cnf [mysqld]datadir=/home/mysqlsocket=/var/lib/mysql/mysq ...

  10. Codeforces Gym101246G:Revolutionary Roads(DFS+思维)

    http://codeforces.com/gym/101246/problem/G 题意:有一个n个点m条边的有向图,现在可以修改某一条有向边使得其为无向边,问修改哪些边可以使得修改后的强连通分量的 ...