给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 0
PoorBest 
Written by xlingfairy
Saturday, 23 January 2010 10:57
想用 c# 做个 joomla 的管理程序,直接用 php 写,有诸多不便.
joomla 是模块化的,这需要我这个管理程序也要是模块化的,这里,我把它叫插件化。
 
以前没做过类似的功能,在网上搜索了一把,做个例子出来。
 
首先,插件必须都有共同的接口,这样文件在主程序里调用。
 
public interface IPlugin {
    string GroupMenu{get;}
    string Menu{get;}
    Form GetForm();
    Form GetSettingForm();
}
 
第二,调用插件,这段是主要的代码,从网上COPY的,做了一点点修改:
   public class Plugin {
        public static List<IPlugin> LoadAllPlugins(string pluginDir) {
            if (pluginDir == "" || !Directory.Exists(pluginDir)) {
                pluginDir = "./plugins";
            }
 
            string interfaceName = typeof(IPlugin).FullName;
 
            List<IPlugin> plugins = new List<IPlugin>();
 
            FileInfo finfo;
            foreach (string file in Directory.GetFiles(pluginDir, "*.dll")) {
                finfo = new FileInfo(file);
                Assembly asm = Assembly.LoadFile(finfo.FullName);
                foreach (Type type in asm.GetTypes()) {
                    IPlugin plugin = (IPlugin)LoadObject(type, interfaceName, null);
                    if (plugin != null)
                        plugins.Add(plugin);
                }
            }
 
            return plugins;
        }
 
        public static object LoadObject(Type type, string interfaceName, object[] param) {
            try {
                //Type t = Type.GetType(className);
 
                if (type == null || !type.IsClass || !type.IsPublic || type.IsAbstract || type.GetInterface(interfaceName) == null) {
                    return null;
                }
 
                object o = Activator.CreateInstance(type, param);
                if (o == null) {
                    return null;
                }
 
                return o;
            } catch {
                return null;
            }
        }
    }
 
。。。
。。。
 
        private void MDIParent1_Load(object sender, EventArgs e) {
            List<IPlugin> plugins = Plugin.LoadAllPlugins("");
            ToolStripMenuItem group;
            ToolStripMenuItem menu;
            foreach (IPlugin plugin in plugins) {
                //Form form = plugin.GetForm();
                //form.MdiParent = this;
                //form.Show();
                group = new ToolStripMenuItem(plugin.GroupMenu);
                menuMain.Items.Add(group);
                menu = new ToolStripMenuItem(plugin.Menu);
                group.DropDownItems.Add(menu);
                //menu.Click += new EventHandler(menu_Click);
                menu.Click += new EventHandler(delegate(Object o, EventArgs args) {
                    Form form = plugin.GetForm();
                    form.MdiParent = this;
                    form.Show();
                });
            }
        }
 
 
插件:
 
namespace CheckEmail {
    public class Class1 : IPlugin {
        #region IPlugin 成员
 
        public string GroupMenu {
            get { return "邮件"; }
        }
 
        public string Menu {
            get { return "检查新邮件"; }
        }
 
        public System.Windows.Forms.Form GetForm() {
            return new CheckEmailForm();
        }
 
        public System.Windows.Forms.Form GetSettingForm() {
            throw new NotImplementedException();
        }
 
        #endregion
    }
}
 
示例下载:
http://my.dajiaozi.com/images/stories/2010/plugintest.rar
Last Updated ( Saturday, 23 January 2010 11:11 )
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 100
Web Links : 7
Content View Hits : 56493

Links