C# 插件第一步 简介
有利于工程的同步开发等等....
接上次介绍的的反射机制
1. 插件类, 新建号dll类文件, 完成相应的功能.例如简单的建立一个myPluginII的类库
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace myPluginII { public class myPluginII { public void PopOut(){ frmPop pop = new frmPop(); frmPop.Show(); //在类库下添加一个窗口类. } } }
build好这个类. 就会生成一个dll文件.
2. 在主程序中的引用中要添加上 myPluginII
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; namespace myFisrtPlugin { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { try { string path = Application.StartupPath ; //path = System.IO.Path.Combine(path,"Plugins") ; //其实当添加好引用后,编译主程序时,会在StartupPath 目录下自动生成对应引用类的dll文档.
//当然为了清晰起见, 可以再debug目录下新建一个Plugins的文件夹
foreach ( string file in System.IO.Directory.GetFiles(path,"*.dll")) { this.cmbPlugins.Items.Add(file) ;// 将dll形式的类库放到comobox中.. } } catch (System.Exception ex) { MessageBox.Show(ex.Message); } } private void button1_Click(object sender, EventArgs e) { try { //1.获得 文件名称 string asmFile = this.cmbPlugins.Text ; string asmName = System.IO.Path.GetFileNameWithoutExtension(asmFile) ; if ( asmFile != string.Empty ) { //2. 利用反射,构造DLL文件的实例 System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(asmFile) ; //3. 利用反射,从程序集(DLL)中,提取类,并把此类实例化
myPluginII.myPluginII p2 = (myPluginII.myPluginII) System.Activator.CreateInstance( asm.GetType(asmName + "." + asmName) ); //4. 在主程序中使用这个类的实例
p2.PopOut(); } } catch ( Exception ex ) { MessageBox.Show(ex.Message ) ; } } } }
实例化的时候, 当然可以写一个借口类, 之下用多种形式的plugin来再实现.. 例如有
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PluginLib { public interface Plugin { string Show(); void Run();
方法1....
方法n } }
新的插件从这个借口集成,再重新实现之..
这样在实例化的时候只要:
PluginLib.Plugin tmpPlug = (PluginLib.Plugin)
System.Activator.CreateInstance(
asm.GetType(asmName+"."+asmName)
);
这里用父类指向子类,来实现多态..
asm.GetType(asmName+"."+asmName) //为该类的命名空间+类名.
另外需要在子插件类中添加 PluginLib的引用. 主程序中需要添加子插件类的引用.
编译之.
然后就好用了..
点击button弹出..
当然这个只是最基本的东西, 有很多东西仍然需要考虑.
刚接触, 所以难免有错误和纰漏, 有高手不吝赐教, 请施惠..
*******************************
***** Never ever let you down. *****
*******************************