新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论.NET,C#,ASP,VB技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 Dot NET,C#,ASP,VB 』 → 如何动态加载控件以及插件编程思想(C#) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6933 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 如何动态加载控件以及插件编程思想(C#) 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 Dot NET,C#,ASP,VB 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 如何动态加载控件以及插件编程思想(C#)

    控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多动态加载控件、动态调用类成员等的资料。下面,我就将动态加载控件总结一下,以供大家参考。(不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见)
    一、动态加载控件
           动态加载,最基本用到的就是反射机制。在System.Reflection的namespace下有一系列的关于获取Assembly信息、类(型)信息的类、接口、结构等。可能上面的话对急切想实现动态加载控件的朋友来说可能一点用也没有,那么就看下面的代码吧,也许可以使你马上实现你想要的:
              //加载控件
              Assembly assembly = Assembly.LoadFrom (@"C:\Controls.dll");
               //获得类(型)
               Type type = assembly.GetType("Controls.UserControl",false,true);
               //设置筛选标志
               BindingFlags bflags = BindingFlags.DeclaredOnly | BindingFlags.Public
                                                           | BindingFlags.NonPublic | BindingFlags.Instance;
               //调用构造函数并获得对象
               Object obj = type.InvokeMember("UserControl", bflags |
                                                                            BindingFlags.CreateInstance, null, null, null);
               //将对象转换类型
               System.Windows.Forms.Control c = (Control)obj;
               //将控件添加到窗体
               this.Controls.Add(c);

    下面对上面程序段用到的一些变量、方法做一点说明
    1、BindingFlags,枚举类型
       BindingFlags.Instance                    : 对象实例
       BindingFlags.Static                         : 静态成员
       BindingFlags.Public                        : 指可在搜索中包含公共成员
       BindingFlags.NonPublic                : 指可在搜索中包含非公共成员(即私有成员和受保护的成员)
       BindingFlags.FlattenHierarchy     : 指可包含层次结构上的静态成员
       BindingFlags.IgnoreCase              : 表示忽略 name 的大小写
       BindingFlags.DeclaredOnly           : 仅搜索 Type 上声明的成员,而不搜索被简单继承的成员
       BindingFlags.CreateInstance       : 表示调用构造函数。忽略 name。对其他调用标志无效
    2、Type.InvokeMember
    public object InvokeMember(
       string name,
       BindingFlags invokeAttr,
       Binder binder,
       object target,
       object[] args
    );
    参数
          name
            String,它包含要调用的构造函数、方法、属性或字段成员的名称。
            - 或 -
            空字符串 (""),表示调用默认成员。
        invokeAttr
               一个位屏蔽,由一个或多个指定搜索执行方式的 BindingFlags 组成。  访问可以是 BindingFlags 之一,如Public、 NonPublic、Private、  InvokeMethod 和 GetField 等。不需要指定查找类型。如果省略查找类型,  则将应用 BindingFlags.Public | BindingFlags.Instance。
          binder
             一个 Binder 对象,该对象定义一组属性并启用绑定,而绑定可能涉及选择重载方法、 强制参数类型和通过反射调用成 员。   - 或 -   若为空引用(Visual Basic 中为 Nothing),则使用 DefaultBinder。
         target
             要在其上调用指定成员的 Object。
        args
             包含传递给要调用的成员的参数的数组。
       返回值
             表示被调用成员的返回值的 Object。
    二、插件编程
             通过上面代码段,我们基本实现动态加载控件。由此我想到了现在网上提到很多的插件式的开发方法。通过动态加载控件,我们不是能很方便的为软件扩充功能吗?我不知道Eclipse这种插件是怎么实现的,但至少这种动态加载控件的方法实现插件编程的一个变通的方法。不是吗?我把一个功能模块做成一个控件,然后在程序启动是扫描目录,即可获得所有的控件,当点击菜单是,将控件加载到窗体就行了。我在母体程序里,我们所要做的只不过要一个容器窗口类来加载控件。当然,事先要有些约定,比如说,控件有哪些可供调用的方法等等。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/5/8 8:28:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 Dot NET,C#,ASP,VB 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 17:25:14

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms