Dynamic Plugins Manager (二) 配置及实现分析
2008-12-11 11:44 Timothy Ye 阅读(556) 评论(0) 编辑 收藏 举报
整个Plugins Manager是一个基于dll的程序集,开发平台,基于VS2008和.NET 3.5 Framework。为何要用.NET 3.5呢?没别的原因,只要是为了尝试一下Linq to XML ![](http://www.xiaozhou.net/cooldog/images/smilies/icon_cool.gif)
使用改组件,需要在应用程序中,添加引用。另外,还需要在应用程序中,建立相关的配置项:
程序代码
<?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.
![](http://www.xiaozhou.net/cooldog/images/smilies/icon_cool.gif)
使用改组件,需要在应用程序中,添加引用。另外,还需要在应用程序中,建立相关的配置项:
![程序代码](http://www.xiaozhou.net/cooldog/images/code.gif)
<?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相一致。
下面是一个配置文件的示例:
![程序代码](http://www.xiaozhou.net/cooldog/images/code.gif)
<?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:此节点用以需要动态编译的插件,如果插件代码中还引用了其他的程序集,需要在此进行描述。
此外,插件还提供了事件通知功能,供应用程序进行响应和处理,实现的事件类型有以下几种:
![程序代码](http://www.xiaozhou.net/cooldog/images/code.gif)
public enum PluginEventType
{
PluginLoadOver, //所有插件加载完毕
PluginAdded, //插件新增完毕
PluginRemoved, //插件卸载完毕
PluginStopped, //插件管理器已停止
PluginStarted //插件管理器已启动
}
插件的事件参数定义如下,只包含简单的事件类型和文本描述:
![程序代码](http://www.xiaozhou.net/cooldog/images/code.gif)
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.