冠冕堂皇

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

http://www.cnblogs.com/zxjay/archive/2008/09/02/1282427.html

插件是遵循一定的编程规范实现的来扩展程序功能的组件。
 
接口定义

public interface IAddIn 

    string Name { get; } 
    string Run(string str); 
}

Name为插件的显示名称。
Run为插件的操作。

接口实现
分别新建Class library工程,编译为.DLL程序集。

1.实现字符串反转功能。

public class ReverseString : IAddIn 

    private string _Name = "Revert String"

    public string Name 
    { 
        get { return _Name; } 
    } 

    public string Run(string str) 
    { 
        var s = str.ToCharArray(); 

        Array.Reverse(s); 

        return new string(s); 
    } 
}


2.实现字符串自身拼接。

public class DoubleString : IAddIn 

    private string _Name = "Double String1"

    public string Name 
    { 
        get { return _Name; } 
    } 

    public string Run(string str) 
    { 
        return str + str; 
    } 
}


宿主程序实现
演示的是插件在主菜单里呈现。

private void AddInTest_Load(object sender, EventArgs e) 

    if (!Directory.Exists(Application.StartupPath + @"\AddIns")) 
    { 
        return
    } 

    // 取得插件目录里所有文件 
    var addIns = Directory.GetFiles(Application.StartupPath + @"\AddIns"); 

    foreach (var file in addIns) 
    { 
        try 
        { 
            // 反射加载,呈现插件 
            var types = Assembly.LoadFile(file).GetExportedTypes(); 

            foreach (var type in types) 
            { 
                var instance = Activator.CreateInstance(type) as IAddIn; 

                if (instance != null
                { 
                    ToolStripMenuItem item = new ToolStripMenuItem(instance.Name); 

                    toolOperate.DropDownItems.Add(item); 
                    item.Tag = instance; 
                    item.Click += new EventHandler(item_Click); 
                } 
            } 
        } 
        catch 
        { 
        } 
    } 


// 调用插件进行操作 
void item_Click(object sender, EventArgs e) 

    ToolStripMenuItem item = sender as ToolStripMenuItem; 

    if (item != null
    { 
        txtResult.Text = ((IAddIn)item.Tag).Run(txtInput.Text); 
    } 
}


运行结果
无插件。


在AddIns文件夹加入插件的程序集。


功能扩展
可以使用XML等对插件进行配置。

优缺点
动态加载、后期调用,在保持原二进制文件不变的基础上扩展软件功能,便于合作开发。
反射加载速度慢,占用资源,操作灵活性受限制、恶意插件有可能进行破坏性操作。 

posted on 2013-08-05 11:52  冠冕堂皇  阅读(174)  评论(0)    收藏  举报