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
{
}
}
}
}
希望对朋友有帮助,若有不妥还请指正......