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

news2025/1/12 16:01:51

一、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.coloradmin.cn/o/2244684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

湘潭大学软件工程算法设计与分析考试复习笔记(四)

回顾 湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;一&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;二&#xff09;湘潭大学软件工程算法设计与分析考试复习笔记&#xff08;三&#xff09; 前言 现在是晚上十一点&#xff0c;我平时是十…

Python毕业设计选题:基于python的豆瓣电影数据分析可视化系统-flask+spider

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 个人中心 管理员登录界面 管理员功能界面 电影管理 用户管理 系统管理 摘要…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

《深入理解 Spring MVC 工作流程》

一、Spring MVC 架构概述 Spring MVC 是一个基于 Java 的轻量级 Web 应用框架&#xff0c;它遵循了经典的 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将请求、响应和业务逻辑分离&#xff0c;从而构建出灵活可维护的 Web 应用程序。 在 Spring MV…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中…

SpringBoot中的restTemplate请求存在乱码问题的解决

SpringBoot中的restTemplate请求存在乱码问题的解决 搜索网上各种解法&#xff0c;最后在不断的一点点对比中&#xff0c;排查到了问题&#xff0c;是restTemplate不支持gzip&#xff0c;对返回的数据不能对gzip自动解压&#xff0c;因此需要去掉header中的accept-encoding 网…

【蓝桥杯C/C++】翻转游戏:多种实现与解法解析

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: 蓝桥杯C/C 文章目录 &#x1f4af;题目&#x1f4af;问题分析解法一&#xff1a;减法法解法二&#xff1a;位运算解法解法三&#xff1a;逻辑非解法解法四&#xff1a;条件运算符解法解法五&#xff1a;数组映射法不同解法的比较…

同三维T80003JEHS 4K/60帧HDMI/SDI超高清H.265解码器

1路HDMI和1路SDI输出&#xff0c;1路3.5音频输入和1路3.5音频输出&#xff0c;1个USB2.0口1个USB3.0口&#xff0c;带1个RS232串口&#xff0c;2个网口&#xff0c;支持1路4K60或4路4K30或16路1080P或32路720P解码输出。4种画面分割显示模式。 产品简介&#xff1a; 同三维T80…

Windows Server 2022 Web1

载入靶机&#xff0c;看到相关描述&#xff1a; 进入虚拟机发现桌面有phpstudy和解题两个软件&#xff1a; 打开解题.exe&#xff0c;发现里面是一些问题&#xff0c;接下来就需要获取相关信息&#xff1a; 1、shell密码 2、IP地址 3、隐藏账户名称 4、挖矿程序的矿池域名 打…

Leetcode打卡:新增道路查询后的最短距离II

执行结果&#xff1a;通过 题目&#xff1a;3244 新增道路查询后的最短距离II 给你一个整数 n 和一个二维整数数组 queries。 有 n 个城市&#xff0c;编号从 0 到 n - 1。初始时&#xff0c;每个城市 i 都有一条单向道路通往城市 i 1&#xff08; 0 < i < n - 1&…

在 CentOS 系统上直接安装 MongoDB 4.0.25

文章目录 步骤 1&#xff1a;配置 MongoDB 官方源步骤 2&#xff1a;安装 MongoDB步骤 3&#xff1a;启动 MongoDB 服务步骤 4&#xff1a;验证安装步骤 5&#xff1a;可选配置注意事项 以下是在 CentOS 系统上直接安装 MongoDB 4.0.25 的详细步骤&#xff1a; 步骤 1&#x…

商城小程序的流程渠道拓展

传统印象里&#xff0c;小程序的开发制作似乎很难&#xff0c;尤其是商城类型且功能体系完善的&#xff0c;事实也确实如此&#xff0c;没有较高的技术和成本投入或团队各个流程的专业人员合作&#xff0c;很难开发出来成品&#xff0c;或者质量较低。 当然对于大公司来说&…

计算机网络 (5)数据通信的基础知识

前言 数据通信是一种以信息处理技术和计算机技术为基础的通信方式&#xff0c;它通过数据通信系统将数据以某种信号方式从一处传送到另一处&#xff0c;为计算机网络的应用和发展提供了技术支持和可靠的通信环境&#xff0c;是现代通信技术的关键部分。 一、数据通信的基本概念…

《云计算网络技术与应用》实训5-1:OpenvSwitch环境安装及常用操作练习

文章目录 OpenvSwitch环境安装及常用操作1. 使用VMware安装CentOS 7虚拟机&#xff0c;安装时需添加多一张网卡&#xff0c;该网卡为自定义-VMnet1.并且记得开启CPU虚拟化&#xff0c;将其命名为“OVS1”。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&am…

用指针遍历数组

#include<stdio.h> int main() {//定义一个二维数组int arr[3][4] {{1,2,3,4},{2,3,4,5},{3,4,5,6},};//获取二维数组的指针int (*p)[4] arr;//二维数组里存的是一维数组int[4]for (int i 0; i < 3; i){//遍历一维数组for (int j 0; j <4; j){printf("%d &…

07架构面试题

目录 一、关于合生元的面试题的架构分析的问题 1. 陈述两种方案的优劣 2. 在那些条件下&#xff0c;会选择哪一个方案 3. 你倾向那一种&#xff1f; 4. 如果要实施方案二的&#xff0c;准备步骤和流程 一、关于合生元的面试题的架构分析的问题 1. 陈述两种方案的优劣 方案…

【Word】一键批量引用论文上标——将正文字体改为上标格式

【Word】一键批量引用论文上标——将正文字体改为上标格式 写在最前面Word一键批量引用论文上标技巧分享核心思路&#xff1a;Word 替换功能 通配符步骤详解1. 打开 Word 替换功能2. 输入通配符模式3. 设置替换格式为上标4. 批量替换 实际效果展示技巧扩展 &#x1f308;你好呀…

C代码编写中 `fileno` 的作用

C代码编写中 `fileno` 的作用 一、`fileno` 的作用二、使用场景三、在C代码中使用 `fileno`四、总结在C语言编程中,fileno 函数是一个非常重要的工具,它在处理文件I/O操作时发挥了关键作用。本文将详细介绍 fileno 的作用、使用场景以及如何在C代码中使用它。 一、fileno 的作…

基于xr-frame实现微信小程序的手部、手势识别3D模型叠加和石头剪刀布游戏功能

前言 xr-frame是一套小程序官方提供的XR/3D应用解决方案&#xff0c;基于混合方案实现&#xff0c;性能逼近原生、效果好、易用、强扩展、渐进式、遵循小程序开发标准。xr-frame在基础库v2.32.0开始基本稳定&#xff0c;发布为正式版&#xff0c;但仍有一些功能还在开发&#…

使用大语言模型创建 Graph 数据

Neo4j 是开源的 Graph 数据库&#xff0c;Graph 数据通过三元组进行表示&#xff0c;两个顶点一条边&#xff0c;从语意上可以理解为&#xff1a;主语、谓语和宾语。GraphDB 能够通过图来表达复杂的结构&#xff0c;非常适合存储知识型数据&#xff0c;本文将通过大语言实现图数…