zoukankan      html  css  js  c++  java
  • 关于插件的开发入门。

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

    插件开发用的知识点是:

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

  • 相关阅读:
    System.Data.SQLite数据库介绍
    php 链接mssql问题 ntext不能读取
    使用NeatUpload上传文件
    js 和后台交互
    oracle学习第五天【RMAN】
    oracle学习第三天【sqlplus常用命令】
    js操作url(window.location)
    jquery资料收集【转】
    php学习3字符串
    linux read命令 小记
  • 原文地址:https://www.cnblogs.com/hankskfc/p/2261308.html
Copyright © 2011-2022 走看看