第一定义接口

/// <summary>     
    /// 这是插件必须实现的接口,也是主程序与插件通信的唯一接口    
    /// 换句话说,主程序只认识插件里的这些方法
    /// </summary>
    public interface IMsgPlug
    {
        void OnShowDlg();
        string OnShowInfo();
    }

定义接口是为了告诉主程序插件做事的方法

第二插件实现接口,并且实现接口的相应的方法

  MyConsole实现接口的方法

public class myConsole : IMsgPlug
    {
        #region IMsgPlug 成员
        public void OnShowDlg()
        {
            Console.WriteLine("控制台调用插件的OnShowDlg方法");
        }

public string OnShowInfo()
        {
            return "myConsole";
        }
        #endregion
    }

插件二实现接口的方法,并且写出要做的事

public class MYDlg : Form, IMsgPlug
    {
        #region IMsgPlug 成员
        public void OnShowDlg()
        {
            this.Text = "插件子窗体";
            this.ShowDialog();
            //调用Form的ShowDialog,显示窗体       
        }
        public string OnShowInfo()
        {
            return "MyDlg";
        }
        #endregion
    }

在使用插件变成的时候要使用反编译程序集,对程序集进行反编译,所以要加载或者是遍历所有编译后的文件

如下:

//定义一个数组来承载所有编译后的文件

private ArrayList plugins = new ArrayList();

//public Form1()
        //{
        //    InitializeComponent();
        //}

/// <summary>    
        /// 载入所有插件      
        /// </summary>       
        private void LoadAllPlugs()
        {
            //获取插件目录(plugins)下所有文件
            string[] files = Directory.GetFiles(Application.StartupPath);
            foreach (string file in files)
            {
                if (file.ToUpper().EndsWith(".DLL"))
                {
                    try
                    {
                        //载入dll 所有的程序集                   
                        Assembly ab = Assembly.LoadFrom(file);
                        Type[] types = ab.GetTypes();
                        foreach (Type t in types)
                        {
                            //如果某些类实现了预定义的IMsg.IMsgPlug接口,则认为该类适配与主程序(是主程序的插件)   
                            if (t.GetInterface("IMsgPlug") != null)
                            {
                                plugins.Add(ab.CreateInstance(t.FullName));
                                listBox1.Items.Add(t.FullName);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }

//加载并且把相应的插件在主程序中调用

private void btnLoadPlus_Click(object sender, EventArgs e)
        {
            LoadAllPlugs();
        }

//调用插件的方法      
        private void btnExcute_Click(object sender, EventArgs e)
        {
            if (this.listBox1.SelectedIndex == -1) return;
            object selObj = this.plugins[this.listBox1.SelectedIndex];
            Type t = selObj.GetType();

    //得到查建中的相应的方法在主程序调用
            MethodInfo OnShowDlg = t.GetMethod("OnShowDlg");
            MethodInfo OnShowInfo = t.GetMethod("OnShowInfo");

    //使用委托调用插件方法做事情
            OnShowDlg.Invoke(selObj, null);
            object returnValue = OnShowInfo.Invoke(selObj, null);
            this.lbMsg.Text = returnValue.ToString();
        }

最新文章

  1. Hadoop单机模式安装-(1)安装设置虚拟环境
  2. 【blade04】用面向对象的方法写javascript坦克大战
  3. nodejs如何储存一个GBK编码的文件
  4. sql2000不能远程注册服务器上sql2000的解决方法
  5. 数据结构 - Codeforces Round #353 (Div. 2) D. Tree Construction
  6. maven 项目配置
  7. BI案例:某通信企业综合报表和决策分析系统实施案例
  8. JDBC 学习笔记(一)—— 基础知识 + 分页技术
  9. 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记2 Xcode、Auto Layout及MVC
  10. C#对word、excel、pdf等格式文件的操作总结
  11. new 的用法
  12. [Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合
  13. github在eclipse中的配置
  14. KeepAlive随笔
  15. 数据挖掘实战&lt;1&gt;:数据质量检查
  16. ios点击输入框,界面放大解决方案
  17. Windows 2012 IIS ASP.NET 安装
  18. P2765 魔术球问题
  19. cocos2d-js 调试办法 断点调试 Android真机调试
  20. maven 使用之自动编译热部署设置

热门文章

  1. Qt MainWindow结构
  2. 过滤emoji表情
  3. 深入理解Bindler
  4. @SuppressWarnings(&quot;deprecation&quot;)
  5. Qt开发中的实用笔记一--xml,Qpainter,Delegate:
  6. 空的安卓工程添加activity
  7. ClownFish:比手写代码还快的通用数据访问层
  8. C# WebApi 请求方式Post,返回Response
  9. linux shell:nginx日志切割脚本
  10. css 文本显示点点点