学习--C# 插件式程序开发
时间:2011-06-08 来源:菊花香
今天在博客园第一次写博,献丑了,有不对的角度,请大家指出并帮忙分析,十分感谢。
上次看了《C# 插件式程序开发》有关插件模式开发,
地址:http://www.cnblogs.com/sndnnlfhvk/archive/2011/06/02/2067713.html
很有兴趣,今天提手在电脑前稍微改了下。
目录如下(目录结构和《C# 插件式程序开发》类似,只是多加 WindowShow项目,所有需要加载DLL都放在Plugins目录下):
Proplugins为启动项目,主界面基本没变化,在此引用下图片:
WindowShow生成DLL文件也被保存在Plugins文件夹下,作为插件加载,显示名称为Form3 FormShow显示按钮名称为Form2,之前名称没命名好 Plugins显示按钮名称为Form1,之前名称没命名好 Interfaces目录下是主接口,所有窗体都会实现这个接口中包含方法。 生成DLL文件如下: AllPlugins.dll含有Form1和Form2 Windowshow.dll 包含Form3启动界面显示如下:
来看看点击Form2按钮后效果:(出现窗体2,点击出现对话框,窗体2就是FormShow)
看看Form3效果:窗体3既是WindowShow项目下的Form3 在主界面显示时,给每个按钮都加了事件,以便点击出现效果: 在界面生成时按钮是如何加载的:
///返回Arraylist对象,内包含所有要显示窗体的对象
list= PluginsIn.instance.Plugins;
for (int i = 0; i < list.Count;i++)
{
Type t=list[i].GetType();
listBox1.Items.Add(t.Name);
Button bt = new Button();
//bt.Size = new Size(new Point(100, 40));
//按钮名称以数字形式命名,既list中object的序列
bt.Name = i.ToString();
bt.Text = t.Name;
//给按钮加入更多内容
//bt.Image=ImageClass.Images.Images[i];
//每个按钮加入事件
bt.Click += new EventHandler(button_Click);
this.MenuButtonPanel.Controls.Add(bt);
}
点击按钮后触发内容:
private void button_Click(object sender, EventArgs e)
{
Button b = sender as Button;
int i=Convert.ToInt32(b.Name);
// i的值就是list中object
object obj = list[i];
Type t = obj.GetType();
MethodInfo OnShowDlg = t.GetMethod("OnShowDlg");
OnShowDlg.Invoke(obj, null);
}
加载DLL程序:
public class PluginsIn
{
public readonly static PluginsIn instance=new PluginsIn();
public PluginsIn()
{
loadAllPlugins();
}
/// <summary>
/// 存储控件
/// </summary>
private ArrayList plugins = new ArrayList();
public ArrayList Plugins
{
get { return plugins; }
}
/// <summary>
/// 载入所有插件
/// </summary>
private void loadAllPlugins()
{
///获取插件目录(plugins)所有DLL
string[] DLLfiles = Directory.GetFiles(Application.StartupPath + @"\Plugins");
foreach (string file in DLLfiles)
{
if (file.ToUpper().EndsWith(".DLL"))
{
try
{
Assembly ass = Assembly.LoadFrom(file);
Type[] types = ass.GetTypes();
foreach (Type t in types)
{
if (t.GetInterface("IMainPlugin") != null)
{
///实例化对象
plugins.Add(ass.CreateInstance(t.FullName));
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
}
以上是实现步骤,欢迎大家指点与评论。