为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C#实现插件式开发(超简单傻瓜式教程)

2019-03-11 12页 doc 35KB 34阅读

用户头像

is_014457

暂无简介

举报
C#实现插件式开发(超简单傻瓜式教程)C#实现插件式开发(超简单傻瓜式教程) 为什么要用插件就不说了,本教程可以实现程序动态加载外部DLL,并调用DLL里面的类、方法,本教程力求已最简单的方式介绍,减少一些不必要的代码给小白造成混淆。 程序分三个部分:接口、插件、Windows程序,比较复杂的是程序如何动态加载与内容调用。 一、 正式教程前科普一下基础知识:(非小白点我跳过) 生成DLL 项目=>新建=>类库 写完代码后shift+f6 生成DLL 快速实现接口 插件同时也可以继承其他类,但插件名称必须写在后面,例如: 项目引用DLL 以下正文===...
C#实现插件式开发(超简单傻瓜式教程)
C#实现插件式开发(超简单傻瓜式) 为什么要用插件就不说了,本教程可以实现程序动态加载外部DLL,并调用DLL里面的类、方法,本教程力求已最简单的方式介绍,减少一些不必要的代码给小白造成混淆。 程序分三个部分:接口、插件、Windows程序,比较复杂的是程序如何动态加载与内容调用。 一、 正式教程前科普一下:(非小白点我跳过) 生成DLL 项目=>新建=>类库 写完代码后shift+f6 生成DLL 快速实现接口 插件同时也可以继承其他类,但插件名称必须写在后面,例如: 项目引用DLL 以下正文================================== 二、 接口 接口的作用是定义一个规则,让插件和程序按这个规则来开发。规则可以是函数、属性…,本文简单定义一个带返回值及参数的接口: 并生成DLL using System; using System.Collections.Generic; using System.Text; namespace MainIO { public interface iMainIO { Decimal Math(Decimal a, Decimal b); } }   三、 插件 新建类库,写一个类,并继承接口,具体的写法为: Public class 插件名字:接口名字 注意必须引用上面写的接口生成的DLL using System; using System.Collections.Generic; using System.Linq; using System.Text; using MainIO; namespace MathPlugs { public class add: iMainIO //注意要引用上面的接口,并且继承 { public decimal Math(decimal a, decimal b) { return (a + b);//简单的a+b } } public class minus : iMainIO { public decimal Math(decimal a, decimal b) { return (a - b); } } }   四、 程序 加载过程按以下次序进行: 获取指定文件夹内所有文件的路径名称==》筛选出“.DLL”==》实例化“DLL”(就是把DLL变成类库)==》类库里面寻找有没有指定接口的类==》加载到ArraryList里面去,这样我们的得到了一个具有约定接口的类了,剩下的就是调用类里面的东西了。简单一点的说就是: 调用方法有两种实现方式: 第一:invoke 接上面加载的过程,我们已经得到了一个类,我们通过这个类就可以调用里面的方法了,具步骤就是 :类==》查找指定方法==》invoke实例化并执行 这个方法不需要程序加载接口的DLL,但必须把接口的DLL放在和插件DLL同一个文件下 第二:强制转换 加载接口的dll到程序里面,而后用强制类型转换,然后就可以直接调用方法了 ((接口的类型)ArrayList里面的对象).函数(参数…) 这种做法assmebly在加载Dll的时候,必须用LoadFile而不能用LoadFrom 下面直接上代码: 程序界面 重点的代码都加粗了 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.IO; using System.Reflection;//实例化 aessmbly using System.Collections;//arraylist using MainIO;//接口的类库 namespace 主程序 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } ArrayList plugList = new ArrayList();//用来存放类的容器 private void BtnLoad_Click(object sender, EventArgs e) { LoadPlug();//按钮直接调用加载过程 } void LoadPlug() { string[] Files = Directory.GetFiles(Application.StartupPath + @"\plug"); //获取指定文件夹内所有文件完整路径,手动在debug下面添加文件夹plug foreach (string File in Files) { if (File.ToUpper().EndsWith(".DLL"))//文件筛选 { Assembly ab = Assembly.LoadFile(File); //文件加载,此处如果用LoadFrom,则无法实现方法强制转换类型的方法调用,只能用invoke Type[] ts = ab.GetTypes(); //类集合的获取,一个类库里面可以有多个namespace,一个namespace里面可以有多个class(类) foreach (Type t in ts) { if (t.GetInterface("iMainIO") != null) //类筛选,在每个类里面用GetInterface:搜索具有指定名称的接口 { plugList.Add(ab.CreateInstance(t.FullName));//类加载到容器里面 listBox1.Items.Add(t.FullName);//显示在listbox1中 }                        } } } } private void BtnCall1_Click(object sender, EventArgs e) { if (listBox1.SelectedIndex == -1) return; try { Decimal a = Convert.ToDecimal(txtP1.Text); Decimal b = Convert.ToDecimal(txtP2.Text); labResult.Text = ((iMainIO)plugList[listBox1.SelectedIndex]).Math(a, b).ToString(); //主程序必须引用接口的类库 //强制将加载的类转换为接口的类型--就是我们开始定义接口那个类型,而后就可以直接xx.类.函数(参数...) } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } private void BtnCall2_Click(object sender, EventArgs e) { if (listBox1.SelectedIndex == -1) return; try { Decimal a = Convert.ToDecimal(txtP1.Text); Decimal b = Convert.ToDecimal(txtP2.Text); object obj = plugList[listBox1.SelectedIndex];//把加载到的对象赋值给一个基类 labResult.Text = obj.GetType().GetMethod("Math").Invoke(obj, new object[] { a, b }).ToString(); //getType,获取基类的具体类型,然后在这个类型里面查找具体的方法,然后用invoke实例化 //所有的参数用object[]的方式赋值,具体为 new object[] {参数1,参数2,参数3,参数......} } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } }
/
本文档为【C#实现插件式开发(超简单傻瓜式教程)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索