BlogWriter博客客户端3 及 插件机制实现原理

BlogWriter 博客客户端 - 3

距上次写有关BlogWriter 文章已有好些天.
上篇文章简单介绍了 BlogWriter 是个什么东东.及其插件制作方法.

亦有朋友说 为何不用 wlw ?   怎么没用, 我也有用啊:-D , But 此文使用BlogWriter
做这个东东,兴趣而已.

现将其放在了CodePlex 上

http://blogwriter.codeplex.com/

BlogWriter 插件实现原理

1 定义接口

所有插件必须实现相应 接口(IPlugin)
IPlugin 接口定义了插件的基本信息, PlugBaseInfo 是的一个件信息的结构体.
及一个启动方法Sstart(). 此方法如同一个C#程序的一Main()方法
,亦有其它类型的插件接口继承自此接口
主程序还将通过此接口检查插件的合法性.

  public    interface    IPlugin  
{  
                                /// <summary>
                                /// 插件的基本信息
                                /// </summary>
                                PlugBaseInfo    BaseInfo{get;}  
                                /// <summary>
                                /// 插件应用的启动方法.加载插件时调用.
                                /// </summary>
                                /// <param name="FunctionMenuItem"></param>
                                void    Start();  
}  

PlugBaseInfo 结构体

  public  struct  PlugBaseInfo
{
                /// <summary>
                /// 插件名称,将在BlogWrite 程序的功能菜单显示
                /// </summary>
                public  string  Name;
                /// <summary>
                /// 插件的类型.宿主程序通过此属性确定插件类型
                /// </summary>
                public  string  Type;
                /// <summary>
                /// 插件图标
                /// </summary>
                public  DW.Image  Ico;
                public  string  Readme;
}

IHost 接口 主程序继承自此接口, 接件通过此接口完成对主程序的访问.
为防上插件破坏主程序,插件通过此接口有限的访问主程序.

public  interface  IHost  
{
                ToolStripMenuItem  FunctionMenu  {  get;  }
                string  Editor_Value  {  get;  set;  }
}

 

2 反射调用 


首选搜索插件目录找到所有插件程序集.

public  string[]  FindAssemblys()
{
                        string  PlugsPath  =  Application.StartupPath  +  "\\Plugins\\";
                        string[]  fis  =  IO.Directory.GetFiles(PlugsPath);
                        return  fis;
}


然后加载找到的程序集

 

Assembly  tmpAss  =  Assembly.LoadFile(filepath);

反射并实例插件对象.

                         //获取类型的构造函数信息
                                                                ConstructorInfo[]    tmpConsInfos    =    tmpType.GetConstructors();  
                                                                foreach    (ConstructorInfo    tmpConsInfo    in    tmpConsInfos)  
                                                                {  
                                                                            //为构造函数生成调用的参数集合
                                                                            .
                                                                            :
                                                                            :
                                                                                //实例化对象
                                                                                object    tmpObj    =    tmpConsInfo.Invoke(tmpParams);  
                                                                                //
                                                                                  foreach    (PropertyInfo    tmpPropertiy    in    tmpType.GetProperties())  
                                                                                {  
                                                                                                if    (tmpPropertiy.Name    ==    "BaseInfo")  
                                                                                                {  
                                                                                                                try  
                                                                                                                {  
                                                                                                                                IP.IPlugin    instance    =    (IP.IPlugin)tmpObj;  
                                                                                                                                PluginList.Add(instance);  
                                                                                                                                //instance.Start();
                                                                                                                }  
                                                                                                                catch  
                                                                                                                {  
                                                                                                                                  
                                                                                                                }  
                                                                                                }  
                                                                                }  
                                                                }  

 

希望对朋友有帮助,若有不妥还请指正......

  

作者:houfeng
出处:http://houfeng.cnblogs.com
本文版权归作者和博客园共有,未经作者同意请保留此声明.
原文地址:https://www.cnblogs.com/houfeng/p/1574175.html