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


namespace Iplugins { public interface IAddPlugins { string Name { get; } void startProgram(TextBox txtbox); } }
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); } } }
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(); } } }
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(); } }
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(); } } }