好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

也来学学插件式开发

也来学学插件式开发

上一家公司有用到插件式开发来做一个工具箱,类似于QQ电脑管家,有很多工具列表,点一下工具下载后就可以开始使用了。可惜在那家公司待的时候有点短,没有好好研究一下。现在有空,自己在网上找了些资料,也来试试。

  主要思路 :公开一个插件接口,如果.DLL或.EXE的代码中有继承这个接口就将其示为插件,并将这些插件放在同一目录。运行程序的时候扫描目录并通过反射判断.DLL或.EXE中是否存在该接口,若存在,则当作插件加载进来。

我们来做一个示例看看。例子也是在园子里找的,自己改了一下,详见:http://www.cnblogs.com/xianhong/archive/2011/03/18/1988191.html

1 建立一个WinForm宿主容器。

2 定义插件接口。

 接口定义的很简单,就两个属性,一个是插件要显示的第一个界面,第二个是插件的图标。当然,根据业务需求你可以加很多其它信息。

    public   interface   Iplugin
    {
          //  设置加载的主窗体 
         Form MainForm
        {
              get  ;
        }

          //  插件显示图片 
         Image ModulePicture
        {
              get  ;
        }
    } 

 3 定义加载插件的方法。

     public   static   class   PluginLoader
    {

          public   static  List<Iplugin> plugins =  new  List<Iplugin> ();


          ///   <summary> 
         ///   判断DLL中是否继承了Iplugin接口
          ///   </summary> 
         ///   <param name="t"></param> 
         ///   <returns></returns> 
         private   static   bool   IsValidPlugin(Type t)
        {
              bool  ret =  false  ;
            Type[] interfaces  =  t.GetInterfaces();
              foreach  (Type theInterface  in   interfaces)
            {
                  if  (theInterface.FullName ==  "  PluginDemo.Interface.Iplugin  "  )
                {
                    ret  =  true  ;
                      break  ;
                }
            }
              return   ret;
        }

          ///   <summary> 
         ///   加载插件,这里是在Debug的plugin目录中搜索插件
          ///   </summary> 
         public   static   void   LoadAllPlugins()
        {
              string [] files = Directory.GetFiles(Application.StartupPath +  "  \\plugin\\  "  );
              int  i =  0  ;

              foreach  ( string  file  in   files)
            {
                  string  ext = file.Substring(file.LastIndexOf( "  .  "  ));
                  if  (ext !=  "  .dll  " )  continue  ;
                  try  
                {
// 加载插件 Assembly tmp = Assembly.LoadFile(file); Type[] types = tmp.GetTypes(); bool ok = false ; foreach (Type t in types) if (IsValidPlugin(t)) {
// 通过反射实例化 Iplugin plugin = (Iplugin)tmp.CreateInstance(t.FullName); plugins.Add(plugin); ok = true ; if (ok) break ; } } catch (Exception err) { throw err; } } } }

4 显示插件

 显示插件的方法,主要是显示插件的主界面就可以了。

  ///   <summary> 
         ///   初始化插件,显示在列表中
          ///   </summary> 
         ///   <param name="plugin"></param> 
         private   void   InitModule(Iplugin plugin)
        {
            PictureBox picture  =  new   PictureBox();
            picture.BackColor  =  System.Drawing.Color.Red;

            picture.Image  =  plugin.ModulePicture;
            picture.InitialImage  =  null  ;
            picture.Dock  =  DockStyle.Left;

            picture.Size  =  new  System.Drawing.Size( 65 ,  71  );
            picture.TabStop  =  false  ;
            panel1.Controls.Add(picture);
              //  单击时加载插件主界面 
            picture.Click += (sender, e) => 
            {
                LoadFrm(plugin.MainForm);
            };
        }

          ///   <summary> 
         ///   加载插件主界面
          ///   </summary> 
         ///   <param name="frm"></param> 
         public   void   LoadFrm(Form frm)
        {
            frm.FormBorderStyle  =  System.Windows.Forms.FormBorderStyle.None;
            frm.ShowIcon  =  false  ;
            frm.ShowInTaskbar  =  false  ;
            frm.BackColor  =  Color.White;
              //  要将是否顶级控件设置为false,否则会报错 
            frm.TopLevel =  false  ;
            frm.Dock  =  DockStyle.Fill;
            TabPage tab  =  new   TabPage(frm.Name);
            tab.Controls.Add(frm);
            tabControl1.TabPages.Add(tab);
            tab.Show();
            frm.Show();
            frm.BringToFront();
            frm.Focus();
        } 

 5 增加插件

 前期准备差不多了,现在我们新建一个插件来测试一下:一个简单的显示当前时间的界面。新建一个类库项目,添加一个Windows窗体,然后拉一个textbox,在后台将textboxt的文本设置为当前时间。

        private   void  TimeTip_Load( object   sender, EventArgs e)
        {
            textBox1.Text  =  DateTime.Now.ToString();
        } 

生成项目,将输出路径改到上一个项目中的Debug中的 plugin 目录中。

运行项目后效果如图:

我们已经检测到该插件了。点击后就会加载该插件。

 我们要增加一个显示日期的插件:DataPicker

加载后效果如图:

示例代码下载: 点我

如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)

 

 

标签:  WinForm

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于也来学学插件式开发的详细内容...

  阅读:39次