• 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
    本文版权归作者和博客园共有,未经作者同意请保留此声明.
  • 相关阅读:
    NYOJ 734
    NYOJ 762
    NYOJ 743
    NYOJ 478
    NYOJ 451
    NYOJ 461
    NYOJ 485
    NYOJ 333
    平均互信息
    ASCII码
  • 原文地址:https://www.cnblogs.com/houfeng/p/1574175.html
Copyright © 2020-2023  润新知