读书人

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

发布时间: 2013-01-11 11:57:35 作者: rapoo

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

读书人网 >C#

热点推荐