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中点击相应插件,均可弹出相应窗体。