首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#NET插件式开发解决方法

2013-01-11 
C#.NET插件式开发如题,不明白winform中怎么开发插件,原理是什么?winform插件[解决办法]新建一个类库,定义

C#.NET插件式开发
如题,不明白winform中怎么开发插件,原理是什么? winform 插件
[解决办法]
新建一个类库,定义一个接口 interface IPlugin { void somefunction(); }
新建一个类库,最为一个插件,引用刚才那个接口,编写一个实现类
public class  Plugin1 : IPlugin
{
    public void somefunction() { /* 写一些代码在这里 */ }
}
在主程序中引用接口的类库。
使用反射加载插件的类库。然后转换成接口类型,调用。

你可以编写很多插件,放在一个叫plugins的目录下
你可以在主程序中遍历这个目录,然后反射加载每个插件。也可以在配置文件中指定插件名和路径。

将接口dll分发给第三方开发商,他们就可以为你开发新的插件了。

无需更新主程序,只要放入新的插件,就有了新的功能。
[解决办法]
贴你个例子 ,Good luck

下面是自己写一个简单的例子:

先定义一个接口,将其生成dll文件,命名为server.dll

using System.Text; 

  

namespace PluginInterface 



    public interface IShow 

    { 

        void Show(); 

    } 



然后写主程序,引用server.dll,将主程序生成.exe的可执行文件 

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; 

using PluginInterface; 

  

namespace MainFormProj 



    public partial class Form1 : Form 

    { 

        public Form1() 

        { 

            InitializeComponent(); 

            try 

            { 

                string path = Application.StartupPath; 

                path = System.IO.Path.Combine(path, "Plugins"); 

                foreach (string file in System.IO.Directory.GetFiles(path, "*.dll")) 

                { 

                    listBox1.Items.Add(file.Substring(file.LastIndexOf("\") + 1)); 

                } 

                listBox1.Click += newEventHandler(listBox1_Click); 

            } 

            catch (Exception ex) 



            { 

                MessageBox.Show(ex.Message); 

            } 

        } 

  

        void listBox1_Click(object sender, EventArgs e) 

        { 

            string asmFile = listBox1.SelectedItem.ToString(); 

            string asmName = System.IO.Path.GetFileNameWithoutExtension(asmFile); 

             if (asmFile != string.Empty) 

            { 

                Assembly a = Assembly.LoadFrom("Plugins\" + asmFile); 

                System.Type[] types = a.GetTypes(); 

                foreach (System.Type type in types) 

                { 

                     // 校验加载的 dll 是否实现了契约,当然此处也可以用 Attribute 来实现 

                    if (type.GetInterface("IShow") != null) 

                    { 

                        IShow plugin = (IShow)Activator.CreateInstance(type); 

                        plugin.Show(); 

  

                    } 

                } 

            } 


        } 


    } 



  

记得在生成的目录新建名为Plugins 的目录,用来放置插件 下来开发插件PlugA 和PlugB 

PlugA插件的开发: 

新建一个入口类PlugAEnter ,引用server.dll文件,继承接口: 

 

using System.Text; 

using PluginInterface; 

  

  

namespace PlugA 



    public class PlugAEnter:IShow 

    { 

        public void Show() 

        { 

           new PlusAForm(" 这是 PlugA 插件的内容! " ).Show(); 



        } 

    } 



  

  


新建PlusAForm 的Form窗体,用来显示弹出框,代码如下:

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; 

  

namespace PlugA 



    public partial class PlusAForm : Form 

    { 

        public PlusAForm() 

        { 

            InitializeComponent(); 

        } 

  

        public PlusAForm(string str) 

        { 

            InitializeComponent(); 

             label1.Text = str; 

        } 

    } 



  

PlugB插件的开发: 

新建一个入口类PlugBEnter ,引用server.dll文件,继承接口: 

  

using System.Text; 

using PluginInterface; 



namespace PlugB 



 public class PlugBEnter:IShow 

 { 

   public void Show() 

   { 

     new PlusBForm(" 这是 PlugB 插件的内容! " ).Show(); 

   } 

 } 






新建PlusBForm 的Form窗体,用来显示弹出框,代码如下:


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; 


namespace PlugA 



   public partial class PlusBForm : Form 

   { 

      public PlusBForm() 

      { 

      InitializeComponent(); 

      } 


      public PlusBForm(string str) 

      { 

      InitializeComponent(); 

      label2.Text = str; 

      } 

   } 



编译PlugA.dll 和PlugB.dll 放置如 Plugins 的目录下,OK,运行程序,在ListBox中点击相应插件,均可弹出相应窗体。 

热点排行