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(); } } }
原文链接: