//1 定义插件接口,将其编译成 dll,例如:
using
System;
namespace
PluginInterface
{
public
interface
IShow
{
string
Show() ;
}
}
//2 编写插件. 新建dll工程,并引用第一步做的dll插件,实现其接口,例如:
namespace
PluginA
{
public
class
PluginA : PluginInterface.IShow
{
public
string
Show()
{
return
"I am plugin A"
;
}
}
}
//3. 在指定目录下寻找Dll文件
private
void
frmMain_Load(
object
sender, System.EventArgs e)
{
//获取Plugins目录中所有的DLL文件,并保存在combo中
try
{
string
path = Application.StartupPath ;
path = System.IO.Path.Combine(path,
"Plugins"
) ;
foreach
(
string
file
in
System.IO.Directory.GetFiles(path,
"*.dll"
))
{
this
.cmbPlugins.Items.Add(file) ;
}
}
catch
(Exception ex)
{
MessageBox.Show(ex.Message ) ;
}
}
// 使用插件
privatevoid btnExecute_Click(object sender, System.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)中,提取类,并把此类实例化 PluginInterface.IShow iShow = (PluginInterface.IShow) System.Activator.CreateInstance(asm.GetType(asmName + "Namespace." + asmName+"Class")) ; //4. 在主程序中使用这个类的实例 this.label2.Text = iShow.Show(); } } catch ( Exception ex ) { MessageBox.Show(ex.Message ) ; } }