如何动态加载控件以及插件编程思想

转载 2007年09月13日 09:27:00
控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多动态加载控件、动态调用类成员等的资料。下面,我就将动态加载控件总结一下,以供大家参考。(不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见)
一、动态加载控件
       动态加载,最基本用到的就是反射机制。在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这种插件是怎么实现的,但至少这种动态加载控件的方法实现插件编程的一个变通的方法。不是吗?我把一个功能模块做成一个控件,然后在程序启动是扫描目录,即可获得所有的控件,当点击菜单是,将控件加载到窗体就行了。我在母体程序里,我们所要做的只不过要一个容器窗口类来加载控件。当然,事先要有些约定,比如说,控件有哪些可供调用的方法等等。 

如何动态加载控件以及插件编程思想

控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多动态加载控件、动态调用类...
  • l00109503
  • l00109503
  • 2009年03月24日 14:29
  • 165

如何动态加载控件以及插件编程思想(C#)

关键词:动态加载,控件,插件       控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。...
  • ayun00
  • ayun00
  • 2007年01月30日 17:32
  • 712

如何动态加载控件以及插件编程思想(C#)

控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多动态加载控件、动态调用类...
  • Peak915
  • Peak915
  • 2005年07月19日 14:02
  • 808

[转]如何动态加载控件以及插件编程思想(C#)

?控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多动态加载控件、动态调用...
  • dcboy
  • dcboy
  • 2004年07月31日 11:33
  • 642

(C#)利用反射动态调用类成员、动态加载控件以及插件编程思想

字符串创建对象string myClassName = typeof(RemotingApplicationConfigure).AssemblyQualifiedName;object myObj ...
  • zuilong1208
  • zuilong1208
  • 2007年04月24日 16:59
  • 2157

C# 动态加载插件的实现

花了半天时间,终于弄懂了C#如何现实动态加载插件的。就像photoshop一样只要在plugin里面丢几个dll就可以多一个滤镜。 总体思路必将简单 1.必须定义公共接口规范,说白点就是主程序在调...
  • u012804387
  • u012804387
  • 2014年03月25日 15:20
  • 474

面向对象与面向过程的编程思想比较

面向过程与面向对象的区别 面向过程”是一种以事件为中心的编程思想。   就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。   “面向对象...
  • u014602483
  • u014602483
  • 2015年08月20日 20:45
  • 1526

Android-动态加载插件化的两种实现方式(二):接口

上一篇博客中http://blog.csdn.net/lxping51/article/details/71480239,主要通过反射的方式来实现动态加载插件化,今天我们以接口的方式来达到目的。接口的...
  • lxping51
  • lxping51
  • 2017年05月09日 17:19
  • 509

关于在VB中动态加载控件的方法

动态加载控件,有诸多好处, 以前以为,只有在VC中才能动态加载控件,而在VB中,只能定义一个数组,然后采用Load方式加载。近日编码,才发现,原来VB中也可以方便的动态加载。 举例子总结一下,免得以后...
  • tiger119
  • tiger119
  • 2006年04月10日 21:51
  • 4009

App的动态加载和插件化,文件,其他( 安全问题)

Android  App的动态加载和插件化-做个标记(未完)   > Android混淆打包那些事儿:http://www.jianshu.com/p/44e3b127393e#   > 应用资源...
  • ShareUs
  • ShareUs
  • 2016年03月23日 18:21
  • 972
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何动态加载控件以及插件编程思想
举报原因:
原因补充:

(最多只允许输入30个字)