博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于插件的开发入门。
阅读量:5058 次
发布时间:2019-06-12

本文共 2817 字,大约阅读时间需要 9 分钟。

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

插件开发用的知识点是:

  • 元数据。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/archive/2011/11/24/2261308.html

你可能感兴趣的文章
Luogu4423 BJWC2011 最小三角形 平面最近点对
查看>>
CF1039D You Are Given a Tree 根号分治、二分、贪心
查看>>
(十四)WebGIS中地图放大缩小的设计和实现
查看>>
团队-UML
查看>>
SharePoint 2013 引发类型为“System.ArgumentException”的异常。 參数名: encodedValue
查看>>
谈谈单元測试之(二):測试工具 JUnit 3
查看>>
ASP.NET MVC Model绑定(五)
查看>>
orale 查询每年、每月、每日统计量的sql语句
查看>>
Android内核sysfs中switch类使用实例
查看>>
POJ2288 Islands and Bridges(TSP:状压DP)
查看>>
POJ3250 Bad Hair Day(单调栈)
查看>>
[No0000195]NoSQL还是SQL?这一篇讲清楚
查看>>
IOS开发UI篇--UITableView的自定义布局==xib布局
查看>>
【深度学习】caffe 中的一些参数介绍
查看>>
Python-Web框架的本质
查看>>
Unrecognized Windows Sockets error: 0: JVM_Bind 异常解决办法
查看>>
struts2中<s:form>的应用
查看>>
QML学习笔记之一
查看>>
openoj的一个小比赛(G题解题报告)优先队列
查看>>
7NiuYun云存储UploadPicture
查看>>