知识:反射,接口,程序集
写插件的主要步骤:
1 在主程序的执行目录下新建一个文件夹plugins
2 在主程序中遍历plugins中满足记事本接口的文件
3 找到以后对使用dll对文本文件进行操作
(主要通过1 反射获取dll文件的路径,以及元数据; 2 定义接口类型的变量调用接口中定义的方法)

 

完整项目代码

1 定义记事本接口

namespace Iplugins
{
    public interface IAddPlugins
    {
        string Name
        {
            get;
        }

        void startProgram(TextBox txtbox);
    }
}
View Code

2 记事本主程序

namespace _01Note
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //1 检查plugins目录下是否存在.dll文件
            //获取当前执行程序的目录
            string startPath = Assembly.GetExecutingAssembly().Location;
            string pluginsPath = Path.Combine(Path.GetDirectoryName(startPath), "plugins");//使用combine可以不用考虑“\”
            //将所有dll文件路径保存在一个String数组中
            string[] dlls = Directory.GetFiles(pluginsPath, "*.dll");

            //2 plugins目录下是否存在.dll文件存在
            //2.1加载plugins目录下的程序集
            foreach (string item in dlls)
            {
                Assembly asem = Assembly.LoadFile(item);
                //获取所有的public类型
                Type[] dllsType = asem.GetExportedTypes();
                //获取接口类型
                Type IpluginsType = typeof(IAddPlugins);

                //循环遍历遍历每一个dll文件中的类型是否实现了IPlugins接口
                foreach (Type dllsTypeItem in dllsType)
                {
                    if (IpluginsType.IsAssignableFrom(dllsTypeItem) && !dllsTypeItem.IsAbstract)
                    {
                        IAddPlugins addPlugins = (IAddPlugins)Activator.CreateInstance(dllsTypeItem);
                        ToolStripItem tspItem = this.格式ToolStripMenuItem.DropDownItems.Add(addPlugins.Name);
                        //由于addPlugins是局部变量,可以通过tag属性,设置包含有关项的数据的对象。
                        tspItem.Tag = addPlugins;
                        //给菜单栏按钮添加事件
                        tspItem.Click += new EventHandler(tsp_click);
                    }
                }

            }
        }

        private void tsp_click(object sender, EventArgs e)
        {
            ToolStripItem tsp = (ToolStripItem)sender;
            IAddPlugins addplugins = (IAddPlugins)tsp.Tag;
            addplugins.startProgram(textBox1);
        }
    }
}
View Code

3 改变成大写插件

namespace Plugins_changeUpper
{
    public class changUpper : IAddPlugins
    {
        public string Name
        {
            get
            {
                return "大写";
            }
        }

        public void startProgram(System.Windows.Forms.TextBox txtbox)
        {
            txtbox.Text = txtbox.Text.ToUpper();
        }
    }
}
View Code

4 改变样式插件

//类库代码

 public class ChangeStyle : IAddPlugins
    {
        public string Name
        {
            get
            {
                return "改变样式";
            }
        }

        public void startProgram(TextBox txtbox)
        {
            Form1 styleForm = new Form1(txtbox);
            styleForm.Show();
        }
    }
//窗体代码
 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private TextBox _txtBox;
        public Form1(TextBox txtBox):this()
        {
            _txtBox = txtBox;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            float fontSize = float.Parse(comboBox1.Text);
            _txtBox.Font = new Font(comboBox2.Text, fontSize);
            this.Close();
        }
    }
View Code

5 添加时间插件

namespace Plugins_AddTime
{
    public class AddTime : IAddPlugins
    {
        public string Name
        {
            get
            {
                return "添加时间";
            }
        }

        public void startProgram(System.Windows.Forms.TextBox txtbox)
        {
            txtbox.Text += "\r\n";
            txtbox.Text += "\t\t\t\t"+DateTime.Now.ToString();
        }
    }
}
View Code

 

posted on 2015-08-13 14:01  lvsally  阅读(148)  评论(0编辑  收藏  举报