插件模块与模块之间的通信(转)

插件模块与模块之间的通信

在这里做个代码备注 防止下次忘记。。。using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using MessageBox = System.Windows.MessageBox;

namespace PLUGIN.SYSTEMFRAMEWORK.PLUGINS
{
    class PluginHelper
    {

        /// <summary>
        /// 模块之间 委托事件 通信
        /// </summary>
        /// <param name="parentWindow">父Window</param>
        /// <param name="reflectioneventName">要反射模块中的 委托事件名称</param>
        /// <param name="currentEventName">在当前类中要执行的事件名称</param>
        /// <param name="filePath">反射文件的路经</param>
        /// <param name="plugin">插件模块信息</param>
        /// <param name="eventParameter">[参数]通信的消息 List集合对象</param>
        public static void ModulEventCommunication(Window parentWindow, string reflectioneventName,
                                                    string currentEventName, string filePath, Plugin plugin,
                                                    object[] eventParameter)
        {
            if (reflectioneventName == null)
                throw new ArgumentNullException("reflectioneventName");
            if (currentEventName == null)
                throw new ArgumentNullException("currentEventName");
            if (filePath == null)
                throw new ArgumentNullException("filePath");
            if (eventParameter == null)
                throw new ArgumentNullException("eventParameter");
            try
            {
                Assembly assembly = Assembly.LoadFrom(filePath + plugin.NameSpace + "." + plugin.Exends);
                Type[] type = assembly.GetTypes();
                foreach (Type t in type)
                {
                    //主要是判断该窗口是否实现 IElementsView 如果没有实现 就不需要反射或者不是插件
                    if (t.GetInterface("IElementsPlugin") != null && t.Name == plugin.ClassName)
                    {
                        //注:在这里要判断是否已经加载:
                        if (AppData.LoadedPlugins.Contains(t.FullName))
                        {
                            return;
                        }
                        //反射执行的成员和类型搜索
                        const BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
                        EventInfo eventInfo = t.GetEvent(reflectioneventName, myBindingFlags);
                        //获取到当前的类
                        var obj = (IElementsPlugin)assembly.CreateInstance(t.FullName);
                        if (eventInfo != null)
                        {
                            Type tDelegate = eventInfo.EventHandlerType;
                            MethodInfo methodHandler = parentWindow.GetType().GetMethod(currentEventName, myBindingFlags);
                            //创建委托
                            Delegate d = Delegate.CreateDelegate(tDelegate, methodHandler);
                            //获取将要处理的事件委托
                            MethodInfo minAddHandler = eventInfo.GetAddMethod();
                            object[] addHandlerArgs =
                                {
                                    d
                                };
                            //调用
                            minAddHandler.Invoke(obj, addHandlerArgs);
                            FieldInfo field = t.GetField(reflectioneventName,
                                                        myBindingFlags);
                            if (field != null)
                            {
                                Object fieldValue = field.GetValue(obj);
                                if (fieldValue is Delegate)
                                {
                                    var objectDelegate = fieldValue as Delegate;
                                    //动态调用
                                    objectDelegate.DynamicInvoke(eventParameter);
                                }
                            }
                        }
                        if (obj != null)
                        {
                            obj.Show(AppData.CurrentMainWindow);
                            //添加已经打开的窗口 :在关闭的时候 要删除此项
                            AppData.LoadedPlugins.Add(t.FullName);
                        }
                    }

                }
            }
            catch (FileNotFoundException)
            {
                MessageBox.Show("尊敬的用户您好!没有找到相应的模块!", "插件提示!", MessageBoxButton.OK,
                                  MessageBoxImage.Information);
            }
            catch (TargetParameterCountException)
            {
                MessageBox.Show("尊敬的用户您好!在调用模块时发现委托的参数不同!请检查参数的个数!", "插件提示!", MessageBoxButton.OK,
                                MessageBoxImage.Information);
            }
            catch (Exception)
            {
                MessageBox.Show("尊敬的用户您好!系统发现版本与当前系统不匹配!", "插件提示!", MessageBoxButton.OK,
                                MessageBoxImage.Information);
            }
        }

        /// <summary>
        /// 模块之间通信  事件委托
        /// </summary>
        /// <typeparam name="T">对象实体</typeparam>
        /// <param name="parentWindow">父窗前</param>
        /// <param name="reflectioneventName">要反射模块中的 委托事件名称</param>
        /// <param name="currentEventName">在当前类中要执行的事件名称</param>
        /// <param name="filePath">反射文件的路经</param>
        /// <param name="plugin">插件模块信息</param>
        /// <param name="list">[参数]通信的消息</param>
        public static void ModuleEventCommunicationList<T>(Window parentWindow, string reflectioneventName,
                                                    string currentEventName,
                                                    string filePath, Plugin plugin, List<T> list)
        {
            if (reflectioneventName == null)
                throw new ArgumentNullException("reflectioneventName");
            if (currentEventName == null)
                throw new ArgumentNullException("currentEventName");
            if (filePath == null)
                throw new ArgumentNullException("filePath");
            if (!list.Any())
                return;
            try
            {
                Assembly assembly = Assembly.LoadFrom(filePath + plugin.NameSpace + "." + plugin.Exends);
                Type[] type = assembly.GetTypes();

                foreach (Type t in type)
                {
                    //主要是判断该窗口是否实现 IElementsView 如果没有实现 就不需要反射或者不是插件
                    if (t.GetInterface("IElementsPlugin") != null && t.Name == plugin.ClassName)
                    {
                        //注:在这里要判断是否已经加载:
                        if (AppData.LoadedPlugins.Contains(t.FullName))
                        {
                            return;
                        }
                        //反射执行的成员和类型搜索
                        const BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
                        EventInfo eventInfo = t.GetEvent(reflectioneventName, myBindingFlags);
                        //获取到当前的类
                        var obj = (IElementsPlugin)assembly.CreateInstance(t.FullName);
                        if (eventInfo != null)
                        {
                            Type tDelegate = eventInfo.EventHandlerType;
                            MethodInfo methodHandler = parentWindow.GetType().GetMethod(currentEventName, myBindingFlags);
                            //创建委托
                            Delegate d = Delegate.CreateDelegate(tDelegate, methodHandler);
                            //获取将要处理的事件委托
                            MethodInfo minAddHandler = eventInfo.GetAddMethod();
                            object[] addHandlerArgs =
                                {
                                    d
                                };
                            //调用
                            minAddHandler.Invoke(obj, addHandlerArgs);
                            FieldInfo field = t.GetField(reflectioneventName,
                                                        myBindingFlags);
                            if (field != null)
                            {
                                Object fieldValue = field.GetValue(obj);
                                if (fieldValue is Delegate)
                                {
                                    var objectDelegate = fieldValue as Delegate;
                                    //动态调用
                                    objectDelegate.DynamicInvoke(list);
                                }
                            }
                        }
                        if (obj != null)
                        {
                            obj.Show(AppData.CurrentMainWindow);
                            //添加已经打开的窗口 :在关闭的时候 要删除此项
                            AppData.LoadedPlugins.Add(t.FullName);
                        }
                    }

                }
            }
            catch (FileNotFoundException)
            {
                MessageBox.Show("尊敬的用户您好!没有找到相应的模块!", "插件提示!", MessageBoxButton.OK,
                                  MessageBoxImage.Information);
            }
            catch (TargetParameterCountException)
            {
                MessageBox.Show("尊敬的用户您好!在调用模块时发现委托的参数不同!请检查参数的个数!", "插件提示!", MessageBoxButton.OK,
                                MessageBoxImage.Information);
            }
            catch (Exception)
            {
                MessageBox.Show("尊敬的用户您好!系统发现版本与当前系统不匹配!", "插件提示!", MessageBoxButton.OK,
                                MessageBoxImage.Information);
            }

        }
        /// <summary>
        ///  模块之间通信  事件委托
        /// </summary>
        /// <typeparam name="T">对象实体</typeparam>
        /// <param name="pwindow">父窗前</param>
        /// <param name="reflectionEventName">要反射模块中的 委托事件名称</param>
        /// <param name="currentEventName">在当前类中要执行的事件名称</param>
        /// <param name="filepath">反射文件的路经</param>
        /// <param name="plugin">插件模块信息</param>
        /// <param name="objEntity">通信的消息【Entity实体】</param>
        public static void ModuleEventCommuncationObjcet<T>(Window pwindow, string reflectionEventName, string currentEventName, string filepath, Plugin plugin,
            T objEntity)
        {
            if (reflectionEventName == null)
                throw new ArgumentNullException("reflectionEventName");
            if (currentEventName == null)
                throw new ArgumentNullException("currentEventName");
            if (filepath == null)
                throw new ArgumentNullException("filepath");
            if (objEntity == null)
                throw new ArgumentNullException("objEntity");
            try
            {
                Assembly assembly = Assembly.LoadFrom(filepath + plugin.NameSpace + "." + plugin.Exends);
                Type[] type = assembly.GetTypes();

                foreach (Type t in type)
                {
                    //主要是判断该窗口是否实现 IElementsView 如果没有实现 就不需要反射或者不是插件
                    if (t.GetInterface("IElementsPlugin") != null && t.Name == plugin.ClassName)
                    {
                        //注:在这里要判断是否已经加载:
                        if (AppData.LoadedPlugins.Contains(t.FullName))
                        {
                            return;
                        }
                        //反射执行的成员和类型搜索
                        const BindingFlags myBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static;
                        EventInfo eventInfo = t.GetEvent(reflectionEventName, myBindingFlags);
                        //获取到当前的类
                        var obj = (IElementsPlugin)assembly.CreateInstance(t.FullName);
                        if (eventInfo != null)
                        {
                            Type tDelegate = eventInfo.EventHandlerType;
                            MethodInfo methodHandler = pwindow.GetType().GetMethod(currentEventName, myBindingFlags);
                            //创建委托
                            Delegate d = Delegate.CreateDelegate(tDelegate, methodHandler);
                            //获取将要处理的事件委托
                            MethodInfo minAddHandler = eventInfo.GetAddMethod();
                            object[] addHandlerArgs =
                                {
                                    d
                                };
                            //调用
                            minAddHandler.Invoke(obj, addHandlerArgs);
                            FieldInfo field = t.GetField(reflectionEventName,
                                                        myBindingFlags);
                            if (field != null)
                            {
                                Object fieldValue = field.GetValue(obj);
                                if (fieldValue is Delegate)
                                {
                                    var objectDelegate = fieldValue as Delegate;
                                    //动态调用
                                    objectDelegate.DynamicInvoke(objEntity);
                                }
                            }
                        }
                        if (obj != null)
                        {
                            obj.Show(AppData.CurrentMainWindow);
                            //添加已经打开的窗口 :在关闭的时候 要删除此项
                            AppData.LoadedPlugins.Add(t.FullName);
                        }
                    }

                }
            }
            catch (FileNotFoundException)
            {
                MessageBox.Show("尊敬的用户您好!没有找到相应的模块!", "插件提示!", MessageBoxButton.OK,
                                  MessageBoxImage.Information);
            }
            catch (TargetParameterCountException)
            {
                MessageBox.Show("尊敬的用户您好!在调用模块时发现委托的参数不同!请检查参数的个数!", "插件提示!", MessageBoxButton.OK,
                                MessageBoxImage.Information);
            }
            catch (Exception)
            {
                MessageBox.Show("尊敬的用户您好!系统发现版本与当前系统不匹配!", "插件提示!", MessageBoxButton.OK,
                                MessageBoxImage.Information);
            }
        }

    }

}
时间: 2024-10-07 18:18:56

插件模块与模块之间的通信(转)的相关文章

大型网站系统架构的演进(二)分布式模块之间的通信

上一篇文章中讲到了分布式部署之后,各个模块要通过网络进行通信,那么如何通信,用什么协议呢? 可选的方案有http tcp/ip(socket)等 http短连接通信方案 基于http协议,xml报文传输 客户端具体框架为httpclient,服务端为struts2 客户端和服务端的通信在内网 该方案我们实行过一段时间,发现存在性能问题,首先是短连接,在并发量较大的时候,开启大量的tcp连接,这样连接资源容易耗尽,客户端首先成为瓶颈,tps上不去. 我总结的几点原因: 1.每次通信都重新开启新的t

模块与包之间的调用

一. 模块 定义: 如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了.为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块. 模块可以分为自定义模块.内置模块和第三方模块 1.内置模块 2.第三方模块 3.自定义模块 什么叫自定义模块? 自定义模块就是你自己编写的模块 ,在Python中,其后缀名是.py 就是一个模块 例如: 在Pycharm里建个py文件module,写入代码: def say_h

5G通信光模块是什么?5G通信光模块的发展方向如何?

随着移动通信行业的迅猛发展,目前5G已经成为全球关注的超级热门话题,与2G.3G.4G相比,未来光纤通信行业5G地位不容小觑,在5G网络时代,不管什么样的5G承载方案都离不开5G通信光模块,那么5G通信光模块是什么?5G通信光模块的发展方向如何? 5G通信光模块是什么? 5G通信光模块是由光器件.功能电路和光接口等组成的光器件,其主要作用是实现光通信系统中光电转换,将发送端把电信号转换成光信号,然后通过光纤传输到接收端,再由接收端把光信号转换成电信号.5G通信光模块具备体积小.速率高.功耗低等优

python模块与模块之间的调用、包与包之间的调用

模块与模块之间的调用: 1.一个python工程就是一个包,在一个包中可以有多个python文件,一个python文件就是一个模块,一个模块当中可以有类.函数.变量,在我们的工作当中,经常会遇到模块与模块之间的调用 2.调用时,模块的类.函数.变量引入方式.新建first模块,first模块包含类.函数.变量.新建second模块,second模块调用first模块当中的类.函数.变量 first模块: #类class index(object): #类当中的方法 def hello(self)

python 进程之间互相通信-----&gt;队列(推荐使用)

1.进程之间相互通信有几种实现方式. multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的,推荐使用队列,因为管道也需要处理锁的问题. 2队列的主要方法 # 1.q.put方法用以插入数据到队列中,# put方法还有两个可选参数:blocked和timeout.如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间.# 如果超时,会抛出Queue.Full异常.如果blocked为Fals

pyton 编写脚本检测两台主机之间的通信状态,异常邮件通知

最近客户有一个需求要检测两台服务器之间的通信状态.要是通信是失败就需要邮件通知相关人.本来想用shell来实现,shell脚本ping 对端服务器很简单,但是shell的邮件发送比较麻烦,于是使用python实现并且用smtplib模块可以快速实现邮件的发送. 功能如下:1秒钟ping一次目标地址.代码中把你的邮箱改为自己的就可以, 代码: #coding:utf-8 import socket import smtplib import email.MIMEText import email.

python 常用模块 time random os模块 sys模块 json &amp; pickle shelve模块 xml模块 configparser hashlib subprocess logging re正则

python 常用模块 time random os模块 sys模块 json & pickle shelve模块 xml模块 configparser hashlib  subprocess logging re正则 转自老男孩老师Yuan:http://www.cnblogs.com/yuanchenqi/articles/5732581.html 模块&包(* * * * *) 模块(modue)的概念: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,

迅为IMX6开发板支持4G全网通模块GPS模块

IMX6开发板特点 处理器:IMX6开发板支持4G全网通模块GPS模块. 核心板配置:2GB DDR3内存  16GB EMMC 存储,扩展引脚多达320个:运行温度-20 ℃到+80 ℃之间. 核心板连接器:经过大批量检验的核心板连接方式,更优的排列更放心的连接性能. 丰富接口:支持全网通4G模块.GPS模块.WIFI蓝牙.SATA 接口.CAN 总线 千兆以太网.重力加速度计.CAMERA接口等. 设计技术:八层PCB沉金设计,紧凑精致!完美解决电磁兼容,达到成本与性能的完美统一,更加技高一

模块及模块间的接口方式

结构化程序设计时,采用自顶向下和层层分解的模块式编程.那么从概念上需要了解,这些所谓的模块之间接口方式有哪些,以及如何描述呢? 一般来讲,模块可以描述为 : 模块名(参数) {模块体} 模块间的接口方式以及描述如下: (1)全局变量 :定义在模块之外.这是很特殊的一种接口. (2) 子模块返回的信息: 接口一:子模块名(即被调用的函数名) 接口二:return 语句(位于被调用的函数的函数体内). (3)调用模块传递给子模块(参数值传递) 参数形式: 普通变量名或者表达式 (4)调用模块与子模块