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();
}
}
}
原文链接: http://blog.youkuaiyun.com/mypc2010/article/details/8220537