代码改变世界

Dynamic Plugins Manager (二) 配置及实现分析

2008-12-11 11:44  Timothy Ye  阅读(553)  评论(0编辑  收藏  举报
 整个Plugins Manager是一个基于dll的程序集,开发平台,基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢?没别的原因,只要是为了尝试一下Linq to XML

    使用改组件,需要在应用程序中,添加引用。另外,还需要在应用程序中,建立相关的配置项:
程序代码 程序代码

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="PluginsPath" value="D:\MyCode\C# Projects\DynamicPlugInsApp\DynamicPlugInsApp\bin\Debug\Plugins"/>
    <add key="LogPath" value="D:\MyCode\C# Projects\DynamicPlugInsApp\DynamicPlugInsApp\bin\Debug\Log"/>
  </appSettings>
</configuration>


    PluginsPath是插件的主目录,里面通过子目录的方式,存放不同的插件。Plugins Manager在启动的时候,会遍历插件主目录,并搜寻可加载的插件。
   LogPath是插件的日志目录,里面的日志文件,会详细记载插件管理器当前的运行情况。

   另外,在Plugins Manager中,区别不同的插件,是根据不同的插件名称来决定的,这取决于插件dll的命名。
   对于不同的插件,Plugins Manager也提供不同的特性配置文件。配置文件是.xml文件,命名需要和插件dll相一致。
   下面是一个配置文件的示例:
程序代码 程序代码

<?xml version="1.0" encoding="utf-8" ?>
<Plugin>
  <TypeName>Component.Class1</TypeName>
  <EnablePlugin>True</EnablePlugin>
  <ConstructParams>
     <Param type="string" value="msadc" />
     <Param type="int" value="12" />
  </ConstructParams>
  <ReferenceList>
   <Reference>D:\MyCode\C# Projects\DynamicPlugInsApp\ITestInterface\bin\Debug\ITestInterface.dll</Reference>
  </ReferenceList>
</Plugin>


   TypeName:插件的类名,和具体的插件命名空间和类名有关,Plugins Manager根据配置文件提供此相关信息,通过.NET的反射技术,生成具体的插件Instance
   EnablePlugin:插件开关,True表示当前插件可用,False表示阻止Plugins Manager加载此插件。该开关可以在Plugins Manager运行前设定,也可以在Plugins Manager运行时动态更改。Plugins Manager会检测配置文件变化,并留意EnablePlugin开关,以决定是否动态加载或者卸载该插件。
  ConstructParams:此节点,及其子节点,用以读取插件是否需要在运行时初始化构造函数。子节点用以描述构造函数中的参数,以及类型,和初始化的值。构造初始化函数,也是在.NET的反射中实现。这里要注意,节点顺序和构造函数参数顺序有关。如果插件不需要构造函数,可以关闭此节点。
  ReferenceList:此节点用以需要动态编译的插件,如果插件代码中还引用了其他的程序集,需要在此进行描述。

  此外,插件还提供了事件通知功能,供应用程序进行响应和处理,实现的事件类型有以下几种:
  
  
程序代码 程序代码

    public enum PluginEventType
    {
        PluginLoadOver, //所有插件加载完毕
        PluginAdded,      //插件新增完毕
        PluginRemoved,  //插件卸载完毕
        PluginStopped,   //插件管理器已停止
        PluginStarted     //插件管理器已启动
    }
  


   插件的事件参数定义如下,只包含简单的事件类型和文本描述:
  
    
程序代码 程序代码

    public class PluginEventArgs : EventArgs
    {
        #region Private Members
        public PluginEventType EventType { get; set; }
        public string EventMessage { get; set; }
        #endregion

        public PluginEventArgs(PluginEventType eventtype, string message)
        {
            EventType = eventtype;
            EventMessage = message;
        }

    }
  


   以上是使用该插件,需要配置的地方,下一篇日志,将演示该插件的Demo.