现在好多的软件都支持插件,于是自己也做个小的插件程序。
插件开发用的知识点是:
- 元数据。C#中是Type类
eg:如果你想得到Chinese类的Type,一种可以用 Chinese c(Chinese的对象)————》c.GetType();
第二种可以用Chinese类得到-----》typeOf(Chinese)
- 要实现插件开发,首先得指定一定的规范要求。就我们需要指定一个接口。
接下来要做的一个小示例就是简易记事本的插件开发
我们先定义一个接口:
public interface IEditor { string AddinName//插件的名称 { get; } void Execute(TextBox txtbox);//该方法是对记事本中的内容做一些扩展 }
然后就要开始我们的插件开发了。一般我们会在项目底下建立一个文件夹名称为“addin”或者"plug-in"这里我选择前者。
一般我们在程序中要用某个类库,必须将其添加到项目的引用。但是插件是我们开发完项目然后向里面添加“*.dll”,然后运行就可以看到新添加的插件了。-------这里就是用到了反射机制。
string addinsPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string filePath = Path.Combine(addinsPath, "Addins"); string[] files = Directory.GetFiles(filePath, "*.dll");
以上的意思就是,找到Addins文件夹然后找后缀为“dll”的文件。接下来就是要遍历这个过滤掉后得到的文件,进行深入的过滤。
foreach (var item in files) { try { Assembly asem = Assembly.LoadFile(item);//将这个dll加载到内存里面 Type[] typs = asem.GetExportedTypes();//得到这个dll里面所有的元数据 for (int i = 0; i < typs.Length; i++) { Type typIEditor = typeof(IEditor); //这边要判断是否typ[i]可以赋值给typIEditor类型,以及typ[i]是实现这个接口的类型即不是抽象的。 if (typIEditor.IsAssignableFrom(typs[i]) && !typs[i].IsAbstract) { //要将要创造typ[i]的类型的对象。相当于new了一个对象。 object obj = Activator.CreateInstance(typs[i]); IEditor editor = obj as IEditor; //这里就要根据实际需求变了,我是规定在“工具”菜单添加插件 ToolStripItem tsmi = tsmiTool.DropDownItems.Add(editor.AddinName); tsmi.Click += new EventHandler(tsmi_Click);//点击插件菜单的时候执行的事件,由于这里我是对文本框内容修改所以要将editor对象传入 tsmi.Tag = editor;//用来传递新建的editor对象 } } } catch (BadImageFormatException) { continue; }
void tsmi_Click(object sender, EventArgs e) { ToolStripItem tsmi = sender as ToolStripItem; if (tsmi != null) { IEditor editor = tsmi.Tag as IEditor; editor.Execute(this.textBox1); } }
接下来我们就可以开发自定义的插件了。自己创建一个ClassLibrary工程。
然后创建一个类(eg:class1.cs),让这个类去实现一开始约定的规则(IEditor)。
public class Class1 : IEditor { public string AddinName { get { return "转换大写";//用来显示在”工具“菜单下的名称 } } //表示该插件的功能 public void Execute(System.Windows.Forms.TextBox txtbox) { txtbox.Text = txtbox.Text.ToUpper(); } }
最后编译下将编译后的dll文件放到Addins文件夹下。然后就可以看到自定义的插件功能喽。。。。