1 #region 插件机制 2 // 宿主(host):程序寄宿或挂载对象 3 // 有了宿主就可以定义插件(plug-in):符合指定宿主某种接口,并能够提供特定功能的程序 4 5 // 插件架构(插件机制):它降低了宿主与具体的应用模块的依赖,宿主不关心每一个具体的插件如何实现, 6 // 只要该插件满足宿主的规范,那么宿主就能够加载它。 7 // 作为插件,只要满足了宿主的规范便可以被宿主加载 8 9 // 使用插件架构时一般都会使用到 反射(reflector) 10 11 // 规范 在实际编码中体现为 Interface 或者 abstract class 12 13 // 1.定义一个接口 14 /// <summary> 15 /// 插件应遵循的接口 16 /// </summary> 17 public interface IPlugIn{ 18 void Show(); 19 } 20 21 // 2.定义一个插件,需要实现上述接口 22 /// <summary> 23 /// 具体插件 24 /// </summary> 25 public class MyPlugIn : IPlugIn 26 { 27 // IPlugIn 成员 28 public void Show() 29 { 30 Console.WriteLine("this is my plugin"); 31 } 32 } 33 34 // 定义一个 宿主 ,并利用 反射 创建具体插件的实例 35 public class PlugInHost 36 { 37 /// <summary> 38 /// 加载所有的插件 39 /// </summary> 40 /// <returns></returns> 41 public List<IPlugIn> LoadPlugIns() 42 { 43 List<IPlugIn> plugList = new List<IPlugIn>(); 44 Assembly pluginAssembly = null; 45 string path = System.IO.Directory.GetCurrentDirectory() + "/plugins/MyPlugin.dll"; 46 try 47 { 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