想用 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
}
}
示例下载:
| < Prev | Next > |
|---|
Last Updated ( Saturday, 23 January 2010 11:11 )



