关于插件的开发入门。

现在好多的软件都支持插件,于是自己也做个小的插件程序。

插件开发用的知识点是:

  • 元数据。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文件夹下。然后就可以看到自定义的插件功能喽。。。。

原文地址:https://www.cnblogs.com/hankskfc/p/2261308.html