当前位置: 首页 > article >正文

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统

一、Photino.NET简介:

最近发现了一个不错的框架 Photino.Net 一份代码运行,三个平台 windows max linux ,其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。

github:https://github.com/tryphotino/photino.NET

二、示例代码

首先创建一个控制台程序:

添加如下代码:

using Photino.NET;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Unicode;

namespace PhotinoNetDemo
{
    internal class Program
    {
        private static PhotinoWindow? _window;
        private static Timer? _timer;
        [STAThread]
        static void Main(string[] args)
        {
            Console.WriteLine("Hello, World!");
            // 隐藏控制台窗口
            HideConsoleWindow();
            _window =new PhotinoWindow()
                .RegisterWebMessageReceivedHandler(WebMessageHandler)
                .SetIconFile("wwwroot/app.ico")
                .Load("wwwroot/index.html");
                //.Load("wwwroot/menu.html");

            _timer = new Timer(UpdateMessage);
            
            _window.WaitForClose();  

        }

        private static void UpdateMessage(object? state)
        {
            try
            {
                SendWebMessage("updateTime",$"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
            }catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

        private static void WebMessageHandler(object? sender, string e)
        {
            switch (e)
            {
                case "start":
                    _timer.Change(0, 1);
                    break;
                default:
                    break;
            }
            SendWebMessage("updateWebMessage",$"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}后台收到:{e}");
        }

        public static void SendWebMessage(string methodName, object message)
        {
            // 创建 JsonSerializerOptions 实例
            var options = new JsonSerializerOptions
            {
                // 设置 Encoder 属性,允许所有Unicode范围,不进行转义
                Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
            };
            string str = $"{methodName},{System.Text.Json.JsonSerializer.Serialize(message, options)}";
            _window!.SendWebMessage(str);
        }
        [MyCustomAttribute(methodName:"addMessage")]
        public static void AddMessage() { 
            
        }


        // 导入Windows API函数
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

        private const int SW_HIDE = 0;
        // 调用Windows API隐藏控制台窗口
        private static void HideConsoleWindow()
        {
            IntPtr consoleHandle = GetConsoleWindow();
            if (consoleHandle != IntPtr.Zero)
            {
                ShowWindow(consoleHandle, SW_HIDE);
            }
        }
    }
}

添加文件wwwroot

创建index.html

<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <h1>当前时间:<span style="color:red;" id="currentTime"></span></h1>
    <button onclick="start()">开始时间</button>
    <button onclick="fun1()">发送到后台</button>

    <button onclick="fun2()">跳转</button>
    <div id="div1"></div>
</body>
<script type="text/javascript">
    function start() {
        window.external.sendMessage("start");
    }

    function fun1() {
        window.external.sendMessage("111");
    }
    function fun2() {
        window.location = "menu.html";
    }

    window.external.receiveMessage(message => { 
        console.log(message);

        let methodName = message.split(',')[0];
        let params = message.split(',')[1];
 
        switch (methodName) {
            case "updateTime":
                debugger;
                document.getElementById("currentTime").innerHTML = params; 
                break;
            case "updateWebMessage":
                document.getElementById("div1").innerHTML += message + "</br>";
                break;
            default: break;
        }
        
    });
</script>
</html>

发布测试,全量包x64

 

 三、跨平台测试

 全量包才60m ,太牛了。关键还跨平台。

 四、信创支持 国产系统

国产系统目前测试了麒麟V10 ,安装过程虽然麻烦点,但已经成功运行,图片如下:

 五、展望

 不错的技术,持续关注中。本篇文章也会陆续补充测试过程,过程中遇到的问题!!!


http://www.kler.cn/a/408258.html

相关文章:

  • [SUCTF2019]SignIn
  • C语言笔记(自定义类型:结构体、枚举、联合体 )
  • 【kubernetes】kubernetes简介
  • 虚幻引擎---术语篇
  • 实验十三 生态安全评价
  • Linux进程管理查找相关命令
  • C++ 中的模板特化和偏特化
  • R虚拟环境中安装ncdf4库包编译库问题
  • 骑砍2霸主MOD开发(29)-顶点动画
  • # DBeaver 连接hive数仓
  • 标贝科技大模型声音复刻 快速获取高品质专属AI声音
  • 【Rhino】【Python】Create a series of Blocks according to Value of object Property
  • 【042C】基于51RFID门禁系统(LCD12864显示)【Proteus仿真+Keil程序+报告+原理图】
  • Java基础:日期时间相关类
  • python基础导包
  • springmvc-04-Controller及RestFul
  • cocos creator 3.8 3D模型、天空盒、雾 6
  • 基于SpringBoot的京东绿谷旅游信息服务平台设计与实现(源码+定制+开发)
  • 第六届国际科技创新学术交流大会暨新能源科学与电力工程国际学术会议(NESEE 2024)
  • [高阶数据结构三] B-树详解
  • 【Linux】线程的互斥和同步
  • AirScreen 安卓平板作为MacOS副屏
  • 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?
  • postgresql按照年月日统计历史数据
  • VMware16安装macOS12【详细教程】
  • docker 相关命令