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弹出..

 

当然这个只是最基本的东西, 有很多东西仍然需要考虑.

刚接触, 所以难免有错误和纰漏, 有高手不吝赐教, 请施惠..

posted on 2010-08-10 22:43  amojry  阅读(456)  评论(0编辑  收藏  举报