小指令 发表于 2013-1-6 02:22:00

利用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]
查看完整版本: 利用Unity来实现插件开发