博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#利用反射开发插件
阅读量:5924 次
发布时间:2019-06-19

本文共 2368 字,大约阅读时间需要 7 分钟。

hot3.png

 

using System;

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO;
using PluginsAdd;

namespace MyNotePadPlus

{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Main_Load(object sender, EventArgs e)

        {
            //检查plugins目录下是否有DLL文件
            //获取当前执行的exe文件的绝对路径
            string exepath = Assembly.GetExecutingAssembly().Location;
            //获取了插件的目录路径
            string pluginspath = Path.Combine(Path.GetDirectoryName(exepath), "plugins");

            //搜索pluginspath目录下是否有对应的dll文件
            //返回值是一个string数组,里面存储着每个dll文件的完整路径
            string[] dlls = Directory.GetFiles(pluginspath, "*.dll");

            //循环遍历把每个插件(dll)都加载起来。

            foreach (string item in dlls)
            {
                Assembly assem = Assembly.LoadFile(item);

                //获取所有的public类型

                Type[] types = assem.GetExportedTypes();

                //获得接口的Type

                Type typeIEditor = typeof(IEditor);
                //遍历每个类型看看这个类型是否是实现了IEditor接口的类型
                foreach (Type typeClass in types)
                {
                    //判断当前类型typeClass,是否实现了IEditor这个接口。
                    //并且这个类型是可以被实例化的,否则不能用。

                    if (typeIEditor.IsAssignableFrom(typeClass) && !typeClass.IsAbstract)

                    {
                        //创建一个typeClass类型的对象
                        IEditor iEditor = (IEditor)Activator.CreateInstance(typeClass);
                        //在菜单栏中,将该插件的名称增加进去
                      ToolStripItem tsiEditor =  this.格式ToolStripMenuItem.DropDownItems.Add(iEditor.PluginName);
                      tsiEditor.Tag = iEditor;
                      //为tsiEditor注册一个单击事件
                      tsiEditor.Click += new EventHandler(tsiEditor_Click);
                    }
                }

               

            }
        }
        //新增的插件的菜单项的单击事件
        void tsiEditor_Click(object sender, EventArgs e)
        {
            //sender就是当前单击的菜单项
            ToolStripItem tsi = (ToolStripItem)sender;
            IEditor editor = (IEditor)tsi.Tag;
            editor.StartProgram(txtNote);
        }
    }
}

 

======================================

接口:

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace PluginsAdd

{
    public interface  IEditor
    {
        //只读属性,里面存储的是插件的名称
        string PluginName
        {
            get;
        }

        //启动插件程序

        void StartProgram(TextBox txtBox);
    }
}

===================================================

插件:

using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using PluginsAdd;

namespace ClassLibraryPlugins

{
    public class ConvertToUpper:IEditor
    {
        public string PluginName
        {
            get { return "小写转大写"; }
        }

        public void StartProgram(System.Windows.Forms.TextBox txtBox)

        {
           txtBox.Text =  txtBox.Text.ToUpper();
        }
    }
}

 

原文链接:

转载于:https://my.oschina.net/changpinghu/blog/92482

你可能感兴趣的文章
jenkins+maven+git 实现自动化部署
查看>>
linux就该这么学第八课-磁盘分区和挂载,磁盘限额
查看>>
python 之队列
查看>>
SQL Server 储存过程的output 参数
查看>>
JAVA_OPTS
查看>>
OSGI项目中获取文件路径
查看>>
php利用smtp类轻松的发送电子邮件
查看>>
初学Node(三)模块系统
查看>>
关于SQL的常用操作(增、删、改、查)
查看>>
discuz+ecmall+phpcms整合
查看>>
关于java中assert(断言)的使用讲解
查看>>
vi/vim学习
查看>>
新博客,新生活
查看>>
安卓权威编程指南 - 第五章学习笔记(两个Activity)
查看>>
POJ3630Phone List(字典树)
查看>>
初学iBATIS的朋友,如果你不看我这篇文章,你一定后悔,因为它官方文档里面的示例少一个...
查看>>
salt 使用state的sls来批量管理用户
查看>>
长沙集训09.22
查看>>
day02
查看>>
常见操作
查看>>