1 #region 插件机制 2 // 宿主(host):程序寄宿或挂载对象 3 // 有了宿主就可以定义插件(plug-in):符合指定宿主某种接口,并能够提供特定功能的程序 4 5 // 插件架构(插件机制):它降低了宿主与具体的应用模块的依赖,宿主不关心每一个具体的插件如何实现, 6 // 只要该插件满足宿主的规范,那么宿主就能够加载它。 7 // 作为插件,只要满足了宿主的规范便可以被宿主加载 8 9 // 使用插件架构时一般都会使用到 反射(reflector)10 11 // 规范 在实际编码中体现为 Interface 或者 abstract class12 13 // 1.定义一个接口14 ///15 /// 插件应遵循的接口16 /// 17 public interface IPlugIn{18 void Show();19 }20 21 // 2.定义一个插件,需要实现上述接口22 ///23 /// 具体插件24 /// 25 public class MyPlugIn : IPlugIn26 {27 // IPlugIn 成员28 public void Show()29 {30 Console.WriteLine("this is my plugin");31 }32 }33 34 // 定义一个 宿主 ,并利用 反射 创建具体插件的实例35 public class PlugInHost36 {37 ///38 /// 加载所有的插件39 /// 40 ///41 public List LoadPlugIns()42 {43 List plugList = new List ();44 Assembly pluginAssembly = null;45 string path = System.IO.Directory.GetCurrentDirectory() + "/plugins/MyPlugin.dll";46 try47 {48 // 加载程序集49 pluginAssembly = Assembly.LoadFile(path);50 }51 catch (Exception ex)52 {53 54 Console.WriteLine(ex.Message);55 return plugList;56 }57 58 Type[] types = pluginAssembly.GetTypes();59 foreach (Type type in types)60 {61 if (type.GetInterface("IPlugIn") != null)62 {63 // 创建插件的实例64 plugList.Add((IPlugIn)Activator.CreateInstance(type));65 }66 }67 68 return plugList;69 }70 }71 72 // 定义完了插件,扩展规则,宿主之后调用73 static void Main(string[] args)74 {75 PlugInHost host = new PlugInHost();76 var plugins = host.LoadPlugIns();77 foreach (var plugin in plugins)78 {79 plugin.Show();80 }81 82 Console.Read();83 }84 85 #endregion