C#利用反射开发插件

 

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();
        }
    }
}

 


原文链接: http://blog.youkuaiyun.com/mypc2010/article/details/8220537

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值