|
一般來講, 做 Plugin 時, 會
1. 先宣告一個 Interface 或是一個 Abstract Class.
2. 然後 Plugin 去 Implement 這個 Interface, 或是從這個 Abstract Class 下來.
3. 主程式動態把 Plugin Load 進來, 用這個 Interface 或 Abstract Class 來操作.
我寫個 Sample, 您參考一下.
這個 Sample, 當你在主程式
按 F1 時, 會 load MyPlugin 進來, 並且 call MyPlugin1.funF1();
按 F2 時, 會 load MyPlugin 進來, 並且 call MyPlugin1.funF2();
按 F3 時, 會 load MyPlugin 進來, 並且 call MyPlugin2.funF1();
按 F4 時, 會 load MyPlugin 進來, 並且 call MyPlugin2.funF2();
1. 這是共用的宣告部份, 我把用 Interface 和 Abstract Class 的方式都放在例子裡.
namespace PluginInterface
{
abstract public class AbstractPlugin // 用 Abstract 的方法
{
abstract public void funF1();
abstract public void funF2();
}
public interface InterfacePlugin // 用 Interface 的方法
{
void funF1();
void funF2();
}
}
2. 這是我的 Plugin
using PluginInterface;
using System.Windows.Forms;
namespace MyPlugin
{
public class MyPlugin1 : AbstractPlugin // 這是 Plugin1, 用 Abstract Class
{
public override void funF1()
{
MessageBox.Show("This is MyPlugin1.funF1().");
}
public override void funF2()
{
MessageBox.Show("This is MyPlugin1.funF2().");
}
}
public class MyPlugin2 : InterfacePlugin // 這是 Plugin2, 用 Interface
{
void InterfacePlugin.funF1()
{
MessageBox.Show("This is MyPlugin2.funF1().");
}
void InterfacePlugin.funF2()
{
MessageBox.Show("This is MyPlugin2.funF2().");
}
}
}
3. 這是主程式
using System.Reflection;
using PluginInterface;
namespace PluginExample
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
try
{
switch (e.KeyCode) // 這邊去做 Key 的 dispatch
{
case Keys.F1: LoadPlugin1().funF1(); break; // 按 F1,呼叫 MyPlugin1.funF1()
case Keys.F2: LoadPlugin1().funF2(); break; // 按 F2,呼叫 MyPlugin1.funF2()
case Keys.F3: LoadPlugin2().funF1(); break; // 按 F3,呼叫 MyPlugin2.funF1()
case Keys.F4: LoadPlugin2().funF2(); break; // 按 F4,呼叫 MyPlugin2.funF2()
}
}
catch { }
}
private AbstractPlugin LoadPlugin1() // 這個是 Load Plugin1 進來的 Function
{
Assembly objPlugin;
AbstractPlugin A = null;
try
{
objPlugin = Assembly.LoadFrom("MyPlugin.dll");
A = (AbstractPlugin)objPlugin.CreateInstance("MyPlugin.MyPlugin1");
}
catch
{
MessageBox.Show("Load Plugin1 fail.");
}
return A;
}
private InterfacePlugin LoadPlugin2() // 這個是 Load Plugin2 進來的 Function
{
Assembly objPlugin;
InterfacePlugin I = null;
try
{
objPlugin = Assembly.LoadFrom("MyPlugin.dll");
I = (InterfacePlugin)objPlugin.CreateInstance("MyPlugin.MyPlugin2");
}
catch
{
MessageBox.Show("Load Plugin2 fail.");
}
return I;
}
}
}
(责任编辑:admin) |