C# NET framework 4.5调用系统Toast通知

news/2025/2/28 15:32:01/文章来源:https://www.cnblogs.com/xianghrs/p/18531632

最近有一个工控程序,基于net4.5.2开发的,尝试增加win10系统的Toast通知消息,网络收集到如下结论:

1. Toast功能需要net4.8的高版本,调用Microsoft.Toolkit.Uwp.Notifications.dll —— 工控程序不可能升级的

2. 低版本net都是使用winform自己画的窗体,然后自定义动画 —— 成品效果不好

后续自己做了一些尝试:

1. 新建一个高版本net Demo,将Toast功能输出为dll,低版本去调用这个dll —— 环境报错,不可行

2. 新建一个高版本net Demo,将Toast功能输出为exe,低版本去调用这个exe —— 可行,但是发布程序时要额外附带一个exe,令客户诧异

3. 新建一个高版本net Demo,将Toast功能输出为exe,在低版本将exe添加为工程资源,然后从工程资源中调用exe —— 可行,发布程序时也只有一个exe

其中方式3又经过多次优化

1. 低版本调用:工程资源/Toast,硬件本地/Microsoft.Toolkit.Uwp.Notifications.dll —— 发布程序是要额外附带一个dll

1. 低版本调用:工程资源/Toast,工程资源/Microsoft.Toolkit.Uwp.Notifications.dll —— 发布程序时只有一个exe,但是开发操作时要调用两个资源

1. 高版本调用:工程资源/Microsoft.Toolkit.Uwp.Notifications.dll ,低版本调用:工程资源/Toast —— 发布程序时只有一个exe,开发操作时也只需要添加调用一个资源

 

首先是高版本Demo,创建为net4.8版本,在NuGet程序包中添加Microsoft.Toolkit.Uwp.Notifications功能,微软官网有详细介绍

using Microsoft.Toolkit.Uwp.Notifications;
using System;
using System.Threading.Tasks;namespace TryToast
{public class TryToast{//参考https://developer.aliyun.com/article/1094575//.NET中如果使用Microsoft.Toolkit.Uwp.Notifications,必须指定Windows TFM,且要指定window版本,至少为net6.0-windows10.0.17763.0或更高。否则,将报错找不到Show()方法。//右键项目,编辑项目文件,将TargetFramework指定为如下://<TargetFramework>net6.0-windows10.0.17763.0</TargetFramework>//通常,指定TFM后,启动调试会报错没有xxx的目标,确保已运行还原...等错误。//解决办法是:清理项目,并重新生成一次即可。//有时候还会报错 net6.0-windows10.0.17763.0与.Net框架版本不一致,//需要修改为 net5.0-windows10.0.17763.0。或者改为net5后生成无错再改回net6;或者 直接清理项目并重新生成一次。public bool Show(string t1,string t2){bool res = false;try{ToastNotificationManagerCompat.History.Clear();// Requires Microsoft.Toolkit.Uwp.Notifications NuGet package version 7.0 or greaternew ToastContentBuilder()//.AddArgument("action", "viewConversation")//.AddArgument("conversationId", 9813)//.AddHeader("6289", "Camping!!", "action=openConversation&id=6289")
                    .AddText(t1).AddText(t2).Show(toast => { toast.ExpirationTime = DateTime.Now.AddHours(3); });// Not seeing the Show() method? Make sure you have version 7.0, and if you're using .NET 6 (or later), then your TFM must be net6.0-windows10.0.17763.0 or greaterres = true;}catch (Exception ex) {Console.WriteLine($"在程序集TryToast中:{ex.Message}");}return res;}}
}

然后在高版本Demo的MAIN程序中编写参数调用逻辑,需要将NuGet包自动下载的Microsoft.Toolkit.Uwp.Notifications.dll添加到工程资源中,形成如下工程结构

 

需要注意的是CurrentDomain_AssemblyResolve方法,网络上博客都没有考虑大数组的内存溢出问题,这里用一个静态数组规避。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;namespace TryToast
{internal static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>
        [STAThread]static void Main(string[] args){if (args.Length == 0)return;//在InitializeComponent()之前调用 不需要设置为嵌入资源bb = new byte[Properties.Resources.Microsoft_Toolkit_Uwp_Notifications.Length];Array.Copy(Properties.Resources.Microsoft_Toolkit_Uwp_Notifications, bb, bb.Length);AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);if (args.Length == 1){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new Form1());}else if (args.Length == 3){var t1 = new TryToast();t1.Show(args[1], args[2]);}}static byte[] bb = null;static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args){// byte[] bytes = Properties.Resources.Microsoft_Toolkit_Uwp_Notifications;这样直接调用内存会溢出return System.Reflection.Assembly.Load(bb);}}
}

 

高版本编译生成exe后,接下来在低版本net程序中就可以调用了

1.低版本net工程资源中添加刚编译好的exe

2.新建一个BUTTON点击事件

        private void button1_Click(object sender, EventArgs e){string[] the_args = { "1","hello","toast" };byte[] buffer = Properties.Resources.TryToast;//资源数据缓存数组Assembly asm = Assembly.Load(buffer); //加载数据MethodInfo pointInfo = asm.EntryPoint;//获取程序入口点//pointInfo.Invoke(null, new string[][new string[3],new string [3]);//运行//invoke在你传参的时候,如果是单参数当然是没有问题,//如果是多参数就需要注意了,你需要将参数都装到一个object数组(object[])里,//然后进栈的时候程序会将数组内容push进去,而不是数组object[] 这个变量,//而参数在出栈的时候根据委托的参数表一一对应栈中的每个元素安排出栈。pointInfo.Invoke(null, new object[] { the_args });//运行 注意资源属性是否设置为嵌入式
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/828201.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ ftp上传文件

目录结构: ftpdemo/include/elapse.h1 /*************************************************2 Copyright (C), 2019-2029, Guide Tech. Co., Ltd.3 File name: elapse.h4 Author: henry5 Version: V1.0.0.0 6 Date: 202410087 Description:计算函数运行时间8 **************…

Schema Free

向量检索服务DashVector在设计上支持Schema Free。向量检索服务DashVector在设计上支持Schema Free,在插入Doc、更新Doc、插入或更新Doc时,可设置任意KeyValue结构的字段(Field),如下所示: Python示例: collection.insert(Doc(id=1,vector=np.random.rand(4),fields={name…

0基础读顶会论文—流程即服务(PraaS):通过无服务器流程统一弹性云和有状态云

细粒度的无服务器函数为许多新应用提供了动力,这些应用受益于弹性扩展和按需付费计费模型,同时将基础设施管理开销降至最低。为了实现这些特性,函数即服务(FaaS)平台将计算和状态分离,PraaS 通过提供数据本地性、快速调用和高效通信改进了当前的 FaaSAbstract 细粒度的无…

安装和配置CentOS9

安装和配置CentOS9 一、下载CentOS9镜像文件 1.访问官网:首先,你需要访问CentOS的官网或阿里云镜像网站 2.选择版本:在官网上,选择CentOS9的64位操作系统版本进行下载。3.等待下载:点击下载链接后,等待镜像文件下载完成。 二、安装CentOS9 1. 创建虚拟机(以VMware WorkS…

wed服务器一览

cs架构 c客户端 s服务端 bs架构 浏览器nb(客户端) 网站是做服务端客户端浏览器 到 服务器 请求 服务器 到 客户端浏览器 相应

WebSocket简介

一、websocket简介 websocket是一种在单个TCP连接上进行全双工通信的协议。 websocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向…

袋鼠云港口数智化解决方案发布,数智引领,加速“智变”丨2024袋鼠云秋季发布会回顾

2023年12月,交通运输部印发《关于加快智慧港口和智慧航道建设的意见》,《意见》贯穿了“3条主线”,其中最首要的主线是“数字化”,数字化是基础,必须通过数字赋能建设、生产、运营、管理、服务的全要素、全过程、全场景,将数据作为新的生产要素,方可夯实智慧港口和智慧航…

Netty 如何自动探测内存泄露的发生

本文基于 Netty 4.1.112.Final 版本进行讨论本文是 Netty 内存管理系列的最后一篇文章,在第一篇文章 《聊一聊 Netty 数据搬运工 ByteBuf 体系的设计与实现》 中,笔者以 UnpooledByteBuf 为例,从整个内存管理的外围对 ByteBuf 的整个设计体系进行了详细的拆解剖析,随后在第…

ABB机器人IRB6640驱动器维修诊断分析

ABB工业机械手IRB6640是工业自动化领域的重要设备,其伺服驱动单元作为机器人的核心部件,负责提供动力和控制机器人的运动。然而,由于长时间运行、负载变化等因素,驱动单元可能会出现故障。一、ABB工业机械手IRB6640驱动器维修与诊断分析方法1.故障代码诊断: - ABB机器人伺…

HCL AppScan Standard 10.7.0 发布下载,新增功能介绍

HCL AppScan Standard 10.7.0 (Windows) - Web 应用程序安全测试HCL AppScan Standard 10.7.0 (Windows) - Web 应用程序安全测试 HCL AppScan Standard v10 for Windows Multilingual 请访问原文链接:https://sysin.org/blog/appscan-10/ 查看最新版。原创作品,转载请保留出…

惊爆!这些项目管理神器,让你的工作效率瞬间翻倍!

你是否还在为繁琐的项目管理而头疼?是否觉得团队沟通不畅、任务分配混乱、进度跟踪困难?别担心,今天我们就为你揭秘几款项目管理工具软件,它们将彻底改变你的工作方式,让你的工作效率瞬间翻倍! 一、板栗看板板栗看板是一款以直观、易用为特点的国产项目管理软件,它采用看…