CustomPlugInD:实现除法的插件
/// <summary> ///插件基类 /// </summary> public abstract class Base { /// <summary> /// 插件名称 /// </summary> /// <returns></returns> public abstract string Name(); /// <summary> /// 插件描述 /// </summary> /// <returns></returns> public abstract string Desc(); /// <summary> /// 执行方法 /// </summary> /// <param name="param1">参数1</param> /// <param name="param2">参数2</param> /// <returns></returns> public abstract string Run(int param1, int param2); /// <summary> /// 版本 /// </summary> public string Version { get { return "1.0.0"; } } }PlugInA
public class PlugInA: Base { public override string Name() { return "PlugInA"; } public override string Desc() { return "加法"; } public override string Run(int param1,int param2) { return (param1 + param2) + ""; } } }PlugInB
public class PlugInB : Base { public override string Name() { return "PlugInB"; } public override string Desc() { return "减法"; } public override string Run(int param1, int param2) { return (param1 - param2) + ""; } }PlugInC
public class PlugInC : Base { public override string Name() { return "PlugInC"; } public override string Desc() { return "乘法"; } public override string Run(int param1, int param2) { return (param1 * param2) + ""; } }PlugInD
public class PlugInD : Base { public override string Name() { return "PlugInD"; } public override string Desc() { return "除法"; } public override string Run(int param1, int param2) { return (param1 / param2) + ""; } }客户端核心代码:
public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); dgrvPlugins.AutoGenerateColumns = false; } List<PluginModel> List = new List<PluginModel>(); readonly string PlugInPath = Application.StartupPath + "\\PlugIns"; /// <summary> /// 载入插件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btLoadPlugins_Click(object sender, EventArgs e) { if (!Directory.Exists(PlugInPath)) { Directory.CreateDirectory(PlugInPath); } List.Clear(); string[] files = Directory.GetFiles(PlugInPath); foreach (string file in files) { if (file.ToLower().EndsWith(".dll")) { try { Assembly assembly = Assembly.LoadFrom(file); Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.BaseType.FullName == "PlugInBase.Base") { object obj = assembly.CreateInstance(type.FullName); string name = type.GetMethod("Name").Invoke(obj, null).ToString(); string desc = type.GetMethod("Desc").Invoke(obj, null).ToString(); string version = type.GetProperty("Version").GetValue(obj).ToString(); List.Add(new PluginModel { Name = name, Desc = desc, Version = version, type = type, Obj = obj }); } } } catch (Exception ex) { throw ex; } } } dgrvPlugins.DataSource = new BindingList<PluginModel>(List); } /// <summary> /// 打开插件目录 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btOpenPluginDir_Click(object sender, EventArgs e) { Process.Start(PlugInPath); } /// <summary> /// 执行选中插件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btExcute_Click(object sender, EventArgs e) { //获取选择的插件信息 int index = dgrvPlugins.CurrentRow.Index; object obj = List[index].Obj; Type type = List[index].type; //参数 object[] inParams = new object[2]; inParams[0] =Convert.ToInt32( dgrvPlugins.CurrentRow.Cells[2].Value); inParams[1] = Convert.ToInt32(dgrvPlugins.CurrentRow.Cells[3].Value); object value = type.GetMethod("Run").Invoke(obj, inParams); MessageBox.Show(Convert.ToString(value),"结果",MessageBoxButtons.OK); } }项目配置
copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)\PlugIns"以上命令代表,在项目的类库生成后,将类库copy到解决方案的路径子文件夹PlugIns,也就是我们建立存放自定义插件的文件夹。当然,如果不怕麻烦,每次生成后,手动复制到此文件夹也可以,直接复制到客户端程序的..\bin\PlugIns文件夹下。
copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)\bin\Debug"将生成的dll文件,拷贝到客户端程序的bin路径下
优点
1.把扩展功能从框架中剥离出来,降低了框架的复杂度,让框架更容易实现
2.宿主中可以对各个模块解析,完成插件间、插件和主程序间的通信。