学习--C# 插件式程序开发

      今天在博客园第一次写博,献丑了,有不对的角度,请大家指出并帮忙分析,十分感谢。

      上次看了《C# 插件式程序开发》有关插件模式开发,

  地址:http://www.cnblogs.com/sndnnlfhvk/archive/2011/06/02/2067713.html

  很有兴趣,今天提手在电脑前稍微改了下。

      目录如下(目录结构和《C# 插件式程序开发》类似,只是多加 WindowShow项目,所有需要加载DLL都放在Plugins目录下):

      2011060800131127.jpg

    Proplugins为启动项目,主界面基本没变化,在此引用下图片:2011060800201572.png

    WindowShow生成DLL文件也被保存在Plugins文件夹下,作为插件加载,显示名称为Form3
    FormShow显示按钮名称为Form2,之前名称没命名好
    Plugins显示按钮名称为Form1,之前名称没命名好
    Interfaces目录下是主接口,所有窗体都会实现这个接口中包含方法。
  生成DLL文件如下:
     2011060800334037.jpg
       AllPlugins.dll含有Form1和Form2
       Windowshow.dll 包含Form3

 启动界面显示如下:

        2011060800281982.jpg

    来看看点击Form2按钮后效果:(出现窗体2,点击出现对话框,窗体2就是FormShow)

         2011060800355658.jpg

            看看Form3效果:窗体3既是WindowShow项目下的Form3
            2011060800405544.jpg
       在主界面显示时,给每个按钮都加了事件,以便点击出现效果:
            在界面生成时按钮是如何加载的:
   
 
  
1 /// 返回Arraylist对象,内包含所有要显示窗体的对象
2   list = PluginsIn.instance.Plugins;
3   for ( int i = 0 ; i < list.Count;i ++ )
4 {
5 Type t = list[i].GetType();
6 listBox1.Items.Add(t.Name);
7 Button bt = new Button();
8 // bt.Size = new Size(new Point(100, 40));
9 // 按钮名称以数字形式命名,既list中object的序列
10   bt.Name = i.ToString();
11 bt.Text = t.Name;
12 // 给按钮加入更多内容
13 // bt.Image=ImageClass.Images.Images[i];
14 // 每个按钮加入事件
15 bt.Click += new EventHandler(button_Click);
16 this .MenuButtonPanel.Controls.Add(bt);
17 }
        点击按钮后触发内容:
 
 
ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
1 private void button_Click( object sender, EventArgs e)
2 {
3 Button b = sender as Button;
4 int i = Convert.ToInt32(b.Name);
5 // i的值就是list中object
6 object obj = list[i];
7 Type t = obj.GetType();
8 MethodInfo OnShowDlg = t.GetMethod( " OnShowDlg " );
9 OnShowDlg.Invoke(obj, null );
10 }

            加载DLL程序:

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
1 public class PluginsIn
2 {
3 public readonly static PluginsIn instance = new PluginsIn();
4
5 public PluginsIn()
6 {
7 loadAllPlugins();
8 }
9
10 /// <summary>
11 /// 存储控件
12 /// </summary>
13 private ArrayList plugins = new ArrayList();
14
15 public ArrayList Plugins
16 {
17 get { return plugins; }
18 }
19
20 /// <summary>
21 /// 载入所有插件
22 /// </summary>
23 private void loadAllPlugins()
24 {
25 /// 获取插件目录(plugins)所有DLL
26 string [] DLLfiles = Directory.GetFiles(Application.StartupPath + @" \Plugins " );
27 foreach ( string file in DLLfiles)
28 {
29 if (file.ToUpper().EndsWith( " .DLL " ))
30 {
31 try
32 {
33 Assembly ass = Assembly.LoadFrom(file);
34 Type[] types = ass.GetTypes();
35 foreach (Type t in types)
36 {
37 if (t.GetInterface( " IMainPlugin " ) != null )
38 {
39 /// 实例化对象
40 plugins.Add(ass.CreateInstance(t.FullName));
41 }
42 }
43 }
44 catch (Exception ex)
45 {
46 MessageBox.Show(ex.Message);
47 }
48 }
49 }
50 }
51 }

            以上是实现步骤,欢迎大家指点与评论。

转载于:https://www.cnblogs.com/MR520/archive/2011/06/08/2074749.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值