利用Unity来实现插件开发
利用Unity来实现插件开发<div id="cnblogs_post_body">论坛里有许多插件开发的文章,本文就不长篇大论了,说一下我的简单思路:
1、建一个IPlugin接口,每个插件都要继承这个接口。
2、建一个插件管理类,利用Unity来管理各个插件。
<div class="cnblogs_code"> 1 using System.Reflection; 2 using Microsoft.Practices.Unity; 3 publicinterface IPlugin 4 { 5 void LoadPlugin(); 6 string PluginName { get; } 7 } 8 public class PlugInManage 9 {10 /// <summary>11 /// 从dll、exe文件中获取继承IPluin接口的所有类的类型信息12 /// </summary>13 /// <param name="path">文件路径</param>14 /// <returns>类型信息(插件名称,(插件类名称,插件所在程序集名称))</returns>15 public static Dictionary<string, string> Load(string path)16 {17 if (!System.IO.Directory.Exists(path))18 {19 throw new System.IO.DirectoryNotFoundException();20 }21 22 Dictionary<string, string> pluins = new Dictionary<string,string>();23 var files = System.IO.Directory.GetFiles(path);24 foreach (var file in files)25 {26 if (file.ToLower().EndsWith(".exe") || file.ToLower().EndsWith(".dll"))27 {28 var assembly = Assembly.LoadFrom(file);29 var types = assembly.GetTypes();30 foreach (var type in types)31 {32 33 if (type.GetInterfaces().Count(c =>c == typeof(IPlugin)) > 0) 34 {35 36 IPlugin instance = assembly.CreateInstance(type.FullName) as IPlugin;37 if (instance != null)38 {39 _container.RegisterType(typeof(IPlugin), type, type.FullName, new ExternallyControlledLifetimeManager());40 41 var name = string.IsNullOrEmpty(instance.PluginName) ? 42 type.FullName : instance.PluginName;43 name = pluins.ContainsKey(name)?name+"_1":name;44 pluins.Add(name, type.FullName);45 }46 47 }48 }49 }50 }51 return pluins;52 }53 54 static IUnityContainer _container = new UnityContainer();55 public static IPlugin Resolve(string name)56 {57 GC.Collect();58 return _container.Resolve<IPlugin>(name);59 }60 61 }
页:
[1]