在网上想找个plugin的例子,找了很久才找到,写下以后查阅。
public interface IPlugin
{
Int32 Add(Int32 a, Int32 b);
string Name{get;set;}
IPluginHost Host{get;set;}
void Show();
}
/// <summary>
/// The host
/// </summary>
public interface IPluginHost
{
bool Register(IPlugin ipi);
}
class PlugIn : IPlugin
{
private string m_strName;
private IPluginHost m_Host;
public PlugIn()
{
m_strName = "Dynamic";
}
public Int32 Add(Int32 a, Int32 b)
{return a + b;}
public string Name
{
get
{
return m_strName;
}
set
{
m_strName=value;
}
}
public void Show()
{
Main1 mn = new Main1();
mn.ShowDialog();
}
public IPluginHost Host
{
get
{
return m_Host;
}
set
{
m_Host=value;
m_Host.Register(this);
}
}
}
using System.Configuration;
using System;
using System.IO;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using PlugIn;
using System.Reflection;
namespace PluginWindowTest
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form, IPluginHost
{
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private IPlugin[] ipi;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.mainMenu1 = new System.Windows.Forms.MainMenu();
this.menuItem1 = new System.Windows.Forms.MenuItem();
//
// mainMenu1
//
this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItem1});
//
// menuItem1
//
this.menuItem1.Index = 0;
this.menuItem1.Text = "Plugin";
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(520, 357);
this.Menu = this.mainMenu1;
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
string path = Application.StartupPath;
MessageBox.Show(path);
string[] pluginFiles = Directory.GetFiles(path, "*.dll");
ipi = new IPlugin[pluginFiles.Length];
for(int i=0; i<pluginFiles.Length; i++)
{
string args = pluginFiles[i].Substring(
pluginFiles[i].LastIndexOf("//")+1,
pluginFiles[i].IndexOf(".dll")-
pluginFiles[i].LastIndexOf("//")-1);
Type ObjType = null;
//IPlugin ipi;
// load the dll
try
{
// load it
Assembly ass = null;
ass = Assembly.Load(args);
if (ass != null)
{
ObjType = ass.GetType(args+".PlugIn");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
try
{
// OK Lets create the object as we have the Report Type
if (ObjType != null)
{
ipi[i] = (IPlugin)Activator.CreateInstance(ObjType);
ipi[i].Host = this;
Console.WriteLine("ipi.Add(1,2)=" + ipi[i].Add(1,2));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
// Start(assemname);
}
//MessageBox.Show(ConfigurationSettings.AppSettings["App"]);
}
public void Start(string args)
{
Type ObjType = null;
IPlugin ipi;
// load the dll
try
{
// load it
Assembly ass = null;
ass = Assembly.Load(args);
if (ass != null)
{
ObjType = ass.GetType(args+".PlugIn");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
try
{
// OK Lets create the object as we have the Report Type
if (ObjType != null)
{
ipi = (IPlugin)Activator.CreateInstance(ObjType);
ipi.Host = this;
Console.WriteLine("ipi.Add(1,2)=" + ipi.Add(1,2));
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public bool Register(IPlugin ipi)
{
MenuItem mn = new MenuItem(ipi.Name,new EventHandler(NewLoad));
Console.WriteLine("Registered: " + ipi.Name);
menuItem1.MenuItems.Add(mn);
return true;
}
private void NewLoad(object sender, System.EventArgs e)
{
MenuItem mn = (MenuItem)sender;
for(int i=0; i<ipi.Length; i++)
{
string strType = mn.Text;
if(ipi[i]!=null)
{
if(ipi[i].Name==strType)
{
ipi[i].Show();
break;
}
}
}
}
}
}