首页 > 其他分享 >WinForm通过反射调用dll中的串口传参数并获取返回值

WinForm通过反射调用dll中的串口传参数并获取返回值

时间:2024-12-31 14:52:18浏览次数:1  
标签:FormA string MyDll dll split str 串口 WinForm

现有一dll文件MyDll.dll,里边封装了一窗口FormA,现通过FormB调用MyDll.dll中的FormA窗口,传入参数并获取到FormA的返回值(通过FormA中的按钮触发,通过FormB中的委托方法实现返回值)

1.MyDll.dll文件中的FormA方法

  定义委托方法和该委托的事件  

    public delegate void frmProcessDoubleClick(string selectdValue,string selectedLabel);

    public event frmProcessDoubleClick ClickMethod;

  窗体重构函数中增加参数获取FormB传的参数

    方式一,string[]字符串数组

      public MultiSelectForm(string[] args)
      {
          InitializeComponent();
          MessageBox.Show(args[0]);
      }

    方式二,定义通用类作为参数传值

  public MultiSelectForm(LovFormExParameter args)
  {
      InitializeComponent();
      var sql = args.sql;
}

按钮调用事件返回值

 ClickMethod(“1,2,3“, ”一,二,三“);

 

2.FormB中调用MyDll.dll中的FormA,并传入参数

                    if (File.Exists(Mes.Core.Config.ApplicationConfig.getProperty("ApplicationRootPath") + "\\" + "MyDll.dll"))
                    {
                        Assembly assembly = Assembly.LoadFrom(Mes.Core.Config.ApplicationConfig.getProperty("ApplicationRootPath") + "\\" + ”MyDll.dll“);
                        //var MultiSelectType = assembly.GetTypes().FirstOrDefault(m => m.Name.Equals("FormA"));

              //方式一:字符串数组传值 //string[] entity = new string[]{"123ujhfjojfofr","abc","sss"};
              // var form = aa[2].GetConstructor(new Type[] { typeof(string[]) });
      
              //方式二:通用类作为参数传值  
                        MyClass entity= new MyClass();
                        enetity.Sql = @"select * from  t where 1 = 1";
                             var asstype = assembly.GetType("MyDll.FormA");
                        var form = asstype.GetConstructor(new Type[] { typeof(MyClass) });

                        var func = asstype.GetEvents().FirstOrDefault(m => m.Name.Equals("ClickMethod"));
                        var type = asstype.GetNestedType("frmProcessDoubleClick");
                        var del = Delegate.CreateDelegate(type, this, "MultiSelectReturn");
                        
                        Form myForm = (Form)form.Invoke(new object[] { lfItem });
                        func.AddEventHandler(myForm, del);
                        myForm.Owner = this;
                        myForm.ShowDialog();
                    }
                    else
                    {
                        MessageBox.Show("缺少MyDll.dll文件!请联系管理员解决");
                    }

MultiSelectReturn方法获取到返回值

      private void MultiSelectReturn(string selectdValue, string selectedLabel)
      {
          MessageBox.Show(selectdValue + "::" + selectedLabel );

      }

 

3.数据库中存储的时,为分隔符的编码,查询出,为分割符的名称

    封装fn_split 函数,获取分隔符中的每个字符串

 1 CREATE OR REPLACE FUNCTION fn_split (p_str IN VARCHAR2, p_delimiter IN VARCHAR2)
 2   RETURN ty_str_split
 3 --分割函数
 4 -- 新建前要先建立ty_str_split 执行语句为:CREATE OR REPLACE TYPE ty_str_split IS TABLE OF VARCHAR2 (4000);
 5 IS
 6   j INT := 0;
 7   i INT := 1;
 8   len INT := 0;
 9   len1 INT := 0;
10   str VARCHAR2 (4000);
11   str_split ty_str_split := ty_str_split ();
12 BEGIN
13   len := LENGTH (p_str);
14   len1 := LENGTH (p_delimiter);
15   WHILE j < len
16   LOOP
17     j := INSTR (p_str, p_delimiter, i);
18     IF j = 0
19     THEN
20         j := len;
21         str := SUBSTR (p_str, i);
22         str_split.EXTEND;
23         str_split (str_split.COUNT) := str;
24         IF i >= len
25         THEN
26           EXIT;
27         END IF;
28     ELSE
29         str := SUBSTR (p_str, i, j - i);
30         i := j + len1;
31         str_split.EXTEND;
32         str_split (str_split.COUNT) := str;
33     END IF;
34   END LOOP;
35   RETURN str_split;
36 END fn_split;

使用方法:

 1 -- 使用方式
 2 
 3 select * from table(fn_split('1,2',','))
 4 select COLUMN_VALUE from table(fn_split('1,2',','))
 5 
 6 -- 在存储过程中的使用
 7 IS
 8   S_AAC001   SPLIT_ARRAY := SPLIT_ARRAY();
 9   V_CALLBACK VARCHAR2(1000);
10   XCOUNT     NUMBER;
11 BEGIN
12 V_CALLBACK := REPLACE(P_AAC001S, '"', '');
13 S_AAC001 := F_SPLIT(V_CALLBACK, ',');
14 
15 SELECT ((LENGTH(V_CALLBACK) - LENGTH(REPLACE(V_CALLBACK, ','))) /
16 LENGTH(','))
17 INTO XCOUNT
18 FROM DUAL;
19 
20 FOR I IN 0 .. XCOUNT - 1 LOOP
21   SELECT a
22     INTO a
23     FROM t_a
24     WHERE a = S_AAC001(I + 1);
25 END LOOP;
26 
27 EXCEPTION
28 WHEN OTHERS THEN
29 --ROLLBACK;
30 PRM_APPCODE := -1;
31 PRM_ERRORMSG := '过程执行失败!错误信息:' || SQLERRM;
32 END;

 

标签:FormA,string,MyDll,dll,split,str,串口,WinForm
From: https://www.cnblogs.com/jiangyuhu/p/18644019

相关文章

  • C# winform实现下载带进度条
    C#winform实现下载带进度条|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|-------------|------------......
  • 串口DMA配置错误笔记 —— 已解决
    一、DMA发送        1、配置问题        2、发送问题二、DMA接收        1、配置问题        2、接收问题一、DMA发送1、配置问题    使用DMA发送时需要将DMA配置成内存到寄存器搬运,关闭寄存器的地址增长,如果要搬运的多个字......
  • 《燕云十六声》d3dcompiler_47.dll缺失怎么解决?
    一、d3dcompiler_47.dll缺失的原因系统更新或升级:Windows系统的更新可能会更改或删除某些旧版本的DirectX组件,包括d3dcompiler_47.dll。游戏安装不完整:游戏安装过程中可能出现中断或错误,导致某些必要的文件未能正确安装。软件冲突:某些已安装的软件可能与游戏存在冲突,导致d3dc......
  • 玩《燕云十六声》提示缺少msvcp100.dll怎么解决?
    一、msvcp100.dll缺失的原因VisualC++Redistributable安装不完整:msvcp100.dll是MicrosoftVisualC++2010RedistributablePackage中的一个重要文件,如果安装不完整或损坏,就会导致游戏无法找到该文件。系统更新或升级:在某些情况下,系统更新可能会更改或删除某些旧版本的库......
  • 电脑中缺失的nvrtc64_90.dll文件如何修复?
    一、文件丢失问题案例:nvrtc64_90.dll文件缺失问题分析:nvrtc64_90.dll是NVIDIACUDARuntimeCompilation库的一部分,通常与NVIDIA的CUDAToolkit或相关驱动程序一起安装。如果该文件丢失,可能会导致基于CUDA的应用程序(包括某些游戏)无法正常运行。解决方案:重新安装CUDATo......
  • 基于winforms开发的的工控界面,真是够简单粗暴的啊
    基于WinForms开发的工控界面确实呈现出简单粗暴的特点。其界面设计往往直截了当地展示各种功能控件,布局上没有过多华丽的修饰,以实用性为导向。对于工业控制场景而言,操作人员能够迅速找到所需的按钮、仪表盘等元素,无需在复杂的界面导航和精美但可能分散注意力的视觉效果中浪费......
  • Win11系统提示找不到Windows.Media.MixedRealityCapture.dll文件的解决办法
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • Win11系统提示找不到Windows.Media.Speech.dll文件的解决办法
    在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包文件不完整造成,原因可能是某些系统防护软件将重要的DLL文件识别为可疑,阻止并放入了隔离单里,还有一些常见的DLL文件缺少是因为系统没有安装齐全的微软运行库,还有部分情况是因为......
  • opencv只在bin目录下编译dll,在lib目录下编译lib,在bin目录下不编译测试程序的各种exe
    penCV是一个开源的计算机视觉库,它提供了多种编程语言的接口。如果你只想编译出DLL和Lib库文件,而不编译EXE(可执行文件),这通常是因为你想要进行某种形式的动态链接或者库的分发,而不关心EXE文件本身。要实现这一点,你可以在CMake配置OpenCV时,设置BUILD_opencv_world标志为ON,这样会生成......
  • Windows提示dbghelp.dll缺失怎么解决?
    电脑运行时常见问题深度解析与解决方案:以Windows提示dbghelp.dll缺失为例在数字时代,电脑已成为我们工作、学习和娱乐的重要工具。然而,在使用过程中,我们难免会遇到一些棘手的问题,如文件丢失、文件损坏以及系统报错等。作为一位在软件开发领域摸爬滚打多年的从业者,我将为大家深......