Plugin Architecture using C#
来源:互联网 发布:mac外置光驱驱动器 编辑:程序博客网 时间:2024/05/18 01:52
Introduction
This article demonstrates to you how to incorporate a single module, as a plugin for another application or use it as a standalone application. The article will demonstrate how a minimal change is required to obtain the above result.
Background
The basic idea for this article has been adopted from the net, I don't remember the original author, but I found the code as a console application, while what I was searching was a method to use one of my windows application module in another application and run it standalone as well with as minimal changes a possible. A little changes to the console application, and this article is what the final result looks like.
Using the code
The key to a plugin architecture is the implementation of a minimal set of methods by the plugins. These methods are used by the main (incorporating) application to find and recognize the plugins. This minimal set of method is achieved by making an interface, which would declare the methods, that are to be implemented by the plugins. This interface has been defined as follows:
public interface IPlugin{ string Name{get;set;} IPluginHost Host{get;set;} void Show();}
The interface define a few methods. Name
is used to get the name of the plugin to be shown on the main application in the menu. IPluginHost
is used to let the plugin know who is hosting the plugin. Show
will show the main form of the plugin application.
We now make our first plugin in form of a windows application like this.
using System;using PlugIn;namespace Dynamic{ class PlugIn : IPlugin { private string m_strName; private IPluginHost m_Host; public PlugIn() { m_strName = "Dynamic"; } 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); } } }}public class Main1 : System.Windows.Forms.Form { //Your original code goes here... [STAThread] static void Main() { Application.Run(new Main1()); }}
The above code declare the a plugin class so that the parent application could recognize it as a plugin. The application also declare a form class, which is the startup form.
Now compile the plugin as an executable file. Run it, it should run as a normal standalone exe. Copy the exe into the main applications executable directory, and rename it as a DLL instead of a exe.
Now we move to our main application:
for that we have to interface, which is implemented by our application so that it registers with the plugins.
public interface IPluginHost { bool Register(IPlugin ipi); }
The main application is implemented as windows form.
public class Form1 : System.Windows.Forms.Form, IPluginHost { private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private IPlugin[] ipi; private void Form1_Load(object sender, System.EventArgs e) { string path = Application.StartupPath; 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; 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; } } catch (Exception ex) { Console.WriteLine(ex.Message); } } }}
In OnLoad()
, we check for all the DLLs present in the application directory, and scan if any implement the plugin interface. If it does we store it and register the plugin with us. This plugin in turn calls the register method on the main application. The register method add the plugin name with out menu.
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; }
The next time the plugin menu is click, we check for the respective plugin name and call the appropriate plugin.
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; } } } }
Now compile and run the application, with the plugin DLL in the application path, the plugin name would show in the menu. Click the menu and the plugin pops up. Hope you find the code useful.
History
- Plugin Architecture using C#
- Plugin Architecture
- MVC architecture in ASP.Net using C#
- Struts 2 plugin architecture
- Use C# and the .NET Framework to develop your own plugin architecture
- Using the NDK plugin
- Using the NDK plugin
- Using the NDK plugin
- Using a Plugin
- MVC architecture in ASP.Net using C# and Microsoft Data Access Application block
- Eclipse(3.1) Plugin Framework(基于OSGI的Plugin Architecture)
- C# using
- C# using
- C# using
- C# using
- C# using
- C# using
- C# using
- Cisco Unified IP Phone SCCP及SIP协议多个远程安全漏洞
- FreeBSD sendfile(2)函数只写文件权限绕过安全限制漏洞
- Adobe Flash Media Server多个远程溢出漏洞
- Microsoft IIS文件更改通知本地权限提升漏洞(MS08-005)
- No MFC (我) 的自白
- Plugin Architecture using C#
- Microsoft Windows Vista DHCP远程拒绝服务漏洞(MS08-004)
- Microsoft Windows WebDAV Mini-Redirector远程堆溢出漏洞(MS08-007)
- PHP专业项目实例开发
- 在线查询大全
- allowDefinition='MachineToApplication' 的节是错误的
- No MFC 编程01 - 最精简的 win32 程序_编程
- C#获取汉字的区位码的方法
- Algorithm 3_Quick_Sort