| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2801 人关注过本帖, 1 人收藏
标题:插件构架
只看楼主 加入收藏
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
结帖率:100%
收藏(1)
 问题点数:0 回复次数:12 
插件构架
看以前在群里发的邮件,有一个关于插件构架的。拿出来让新手们看看。

------------------------------------------
-^_^!我写的是最简单,只是为了大家方便阅读。
大家可以在这个程序的基础上,进行扩展。
------------------------------------------
程序有三个项目。

第一个是主程序,主窗体。
第二个是插件实例。【插件就是这个了^_-!】
第三个是插件所实现的接口。
 
具体实现:
1.插件接口如下:
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
namespace PluginInterface
{
    public interface IPlugin
    {
        Image SetBackImage { get;}
    }
}

 
这个接口很简单,继承这个接口的类都必须有一个获取图片的属性。没有设置图片哦,因为只有get。呵呵!
 
2.创建插件。这个也是很简单的。只是实现了一个IPlugin接口就完了。
 
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using PluginInterface;
namespace PluginInstance
{
    public class Plugin : IPlugin
    {
        private Image BackImage;
        #region IPlugin 成员
        public Image SetBackImage
        {
            get
            {
                this.BackImage = (Image)Resource.UT;
                return this.BackImage;
            }
        }
        #endregion
    }
}

这个类应该很简单吧?呵呵。简单就对了。
这个Rescource是一个资源文件。在项目中新建一个资源文件,然后放一张图片就可以了。
好的!插件就设计完了。
 
3.应用插件。
 
 
using System;
using System.Collections.Generic;
using
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using PluginInterface;
namespace PluginForLearningCSharp
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
            LoadPlugin();
            this.BackgroundImageLayout = ImageLayout.Stretch;
        }
        private void LoadPlugin()
        {
            Assembly plugin = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + @"\PluginInstance.dll");
            Type[] types = plugin.GetTypes();
            foreach (Type t in types)
            {
                Type biInterface = t.GetInterface("IPlugin");
                if (biInterface != null)
                {
                    IPlugin pluginInterface = (IPlugin)plugin.CreateInstance(t.FullName);
                    this.BackgroundImage = pluginInterface.SetBackImage;
                }
            }
        }
    }
}

这个是插件程序中最重要的。通过动态加载程序集,并创建程序集中实现IPLugin接口的实例。然后我们就可以使用插件了。
大家可以仔细看看源码。看完这个后,自己有兴趣可以去做一个。

图片附件: 游客没有浏览图片的权限,请 登录注册


好了。这就是,最简单的插件构架。万变不离其宗。我想我应该是以最通俗易懂的方式来写的。相信自己,相信Learning C#.
PluginForLearningCSharp.zip (363.23 KB)


[ 本帖最后由 zhoufeng1988 于 2009-10-30 01:14 编辑 ]
搜索更多相关主题的帖子: 插件 构架 
2009-10-30 01:11
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
收藏
得分:0 
不错

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-10-30 07:37
domon
Rank: 3Rank: 3
来 自:河南
等 级:论坛游侠
帖 子:92
专家分:191
注 册:2009-10-26
收藏
得分:0 
顶,学习了!

希望,是走出来的!!!
2009-10-30 08:49
pacocai
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1583
专家分:0
注 册:2007-3-12
收藏
得分:0 
插件式架构主体原则就是接口约束,再就是要灵活的使用域这个概念,不然的话载入的插件不能更好的从内存中清除。使用接口约束,之后使用域来调用插件。

浮生若梦天边月,醉死如酒水中星。红楼一梦千人叹,岂让万夫空做贱。博客:http://hi.baidu.com/rxvip
2009-11-06 16:57
名沁
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:132
专家分:173
注 册:2009-4-5
收藏
得分:0 
学习了
2009-11-06 22:13
lwhoujx
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-11-9
收藏
得分:0 
正在学习中支持!!
2009-11-09 22:28
zhangkecd
Rank: 2
来 自:闲云工作室
等 级:论坛游民
帖 子:159
专家分:91
注 册:2009-3-13
收藏
得分:0 
学习。

闲云野鹤---梦想  
2009-11-13 11:39
dingkai19830
Rank: 1
等 级:新手上路
帖 子:12
专家分:9
注 册:2008-4-30
收藏
得分:0 
byte[] rawAssembly = loadFile(AppDomain.CurrentDomain.BaseDirectory + @"\PluginInstance.dll");
Assembly assembly = Assembly.Load(rawAssembly);
Type[] types = plugin.GetTypes();

一点小建议:(4楼问题的一个简单的解决办法)
读取时这个写,可以使程序在运行时也能替换dll而不锁定,即更新dll时不用重启程序..

[ 本帖最后由 dingkai19830 于 2009-11-14 16:37 编辑 ]
2009-11-14 16:36
liuhelanqiu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2009-11-14
收藏
得分:0 
来学习学习
2009-11-14 20:18
dayong8611
Rank: 2
等 级:论坛游民
帖 子:25
专家分:11
注 册:2009-8-3
收藏
得分:0 
学习了!
2009-11-23 19:09
快速回复:插件构架
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018243 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved