首页 > 编程语言 >C# NET framework 4.5调用系统Toast通知

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

时间:2024-11-07 10:30:35浏览次数:5  
标签:4.5 Toast 调用 C# Uwp Toolkit Notifications exe Microsoft

最近有一个工控程序,基于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 greater
                new 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 greater
                res = 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 });//运行 注意资源属性是否设置为嵌入式

        }

 

 

 

 

标签:4.5,Toast,调用,C#,Uwp,Toolkit,Notifications,exe,Microsoft
From: https://www.cnblogs.com/xianghrs/p/18531632

相关文章

  • 【Oracle】How Do Indexes Become Unusable
    遇到的场景:Oracle数据库的分区表出现UNUSABLEINDEX,下述文档用于解决相关问题。SymptomsDescriptionofwhichoperationsmarkindexpartitionsasINDEXUNUSABLE.描述那些操作使得索引不可用CauseTherearesixtypesofmaintenanceoperationsandaddingapartition......
  • Unity 编iOS版本报错: CocoPods Installation failure
    Unity项目,不带任何SDK导出项目是没有问题的,一旦加入Admob,facebook之后,就会出现:CocoPodsInstallationfailure升级MACOS系统,升级SDK版本,升级Unity版本时,该问题是经常发生!发生该问题表示项目中用pod管理的sdk未下载下来配置好!查看项目目录,可以看到一个名为Podfile的文件,其......
  • C# WebSocket【使用SuperWebSocket实现】
    一)SuperWebSocket实现服务端1、创建窗口程序,WindowsFormsWebsocketServer2、添加程序包工具-->Nuget包管理-->管理解决方案的Nuget程序包-->搜索SuperWebSocket,选择SuperWebSocketNETServer,点击右侧安装,等待安装完成,安装完成以后,项目会多出很多引用库,如下publicpart......
  • 提供一个基本的cmakelists.txt文件
     project(ftptest)message("----------cmake${PROJECT_NAME}----------start")#设置构建类型为Release#set(CMAKE_BUILD_TYPERelease)set(CMAKE_VERBOSE_MAKEFILEON)#set(CMAKE_CXX_FLAGS"$ENV{CXXFLAGS}-rdynamic-O0-ggdb-std=c++11-Wall-Wno-......
  • 蓝凌OA /sys/webservice/hrStaffWebService存在任意文件读取漏洞
    蓝凌OA/sys/webservice/hrStaffWebService接口处存在任意文件读取漏洞FOFAapp="Landray-OA系统"POC文件读取POST/sys/webservice/hrStaffWebServiceHTTP/1.1Host:Content-Type:multipart/related;boundary=----j0ofrwsv2dtllbzzkyh9User-Agent:Mozilla/5.0(Wind......
  • 安装和配置CentOS9
    安装和配置CentOS9一、下载CentOS9镜像文件1.访问官网:首先,你需要访问CentOS的官网或阿里云镜像网站2.选择版本:在官网上,选择CentOS9的64位操作系统版本进行下载。3.等待下载:点击下载链接后,等待镜像文件下载完成。二、安装CentOS91.创建虚拟机(以VMwareWorkStationPro为例)......
  • 高速PCB设计的叠层问题
    高速PCB设计的叠层问题设计电源时,不能过分强调布局良好的PCB的重要性。此外,设计人员必须了解电源操作的重要性才能使工作成功。你有没有想过在pcb内部如何传递能量来给我们的电器供电?在一块PCB板上有太多的微小元件,设计如此复杂的电源来给每一个元件供电,需要极大的技巧、时间和......
  • SQL Server 2022 RTM Cumulative Update 15 发布下载 (累积更新包)
    SQLServer2022RTMCumulativeUpdate15发布下载(累积更新包)最新的累积更新(CU)下载,包含自SQLServer2022RTM发布以来的所有更新。请访问原文链接:https://sysin.org/blog/sql-server-2022/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgSQLServer202......
  • JavaScript中的this到底是什么?
    写在前面在JavaScript中,this关键字是一个非常重要的概念,它指向当前执行上下文中的对象。理解this的工作原理对于编写高效、可维护的JavaScript代码至关重要。本文将深入探讨this关键字的用法和规则。什么是this?this是一个特殊的关键字,在不同的上下文中可以指向不同的对象......
  • JavaScript中的变量作用域
    写在前面在JavaScript中,变量作用域是指变量在代码中可见的范围。理解变量作用域对于编写高效、可维护的JavaScript代码至关重要。本文将深入探讨JavaScript中的变量作用域,包括全局作用域、函数作用域和块级作用域。全局作用域在JavaScript中,任何在函数或块之外声明的变量......