关键词:动态加载,控件,插件
控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员
调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多
动态加载控件、动态调用类成员等的资料。下面,我就将动态加载控件总结一下,以供大家参考。(不过
由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为
朋友看到我的不足,给我提出宝贵意见)
一、动态加载控件
动态加载,最基本用到的就是反射机制。在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这种插件是怎么
实现的,但至少这种动态加载控件的方法实现插件编程的一个变通的方法。不是吗?我把一个功能模块做
成一个控件,然后在程序启动是扫描目录,即可获得所有的控件,当点击菜单是,将控件加载到窗体就行
了。我在母体程序里,我们所要做的只不过要一个容器窗口类来加载控件。当然,事先要有些约定,比如
说,控件有哪些可供调用的方法等等。
参考资料:
1. (C#)利用反射动态调用类成员 作者: lizanhong
2. 在C#程序中实现插件架构 作者:Shawn Patrick Walcheske 译者:电子科技大学 夏桅
3. Building .NET Assemblies Dynamically 作者: Govinda
分享到:
相关推荐
C#动态生成控件以及添加事件处理
C# 实现控件的动态创建 以及 添加控件的事件响应。能够动态控制动态生成控件的个数,其中还包括父窗口与子窗口的交互操作,子窗口相对父窗口的居中显示。 代码详细,VS2008编程环境,可以直接运行。
C# 动态加载pictureBox到listview控件上
在 .net C#,在panel上动态增加控件示例子,简单,一看就会.
C#动态加载用户控件
动态加载用户控件动态加载用户控件动态加载用户控件动态加载用户控件
VB之精彩编程-VB6.0动态加载ActiveX控件漫谈
用c#编写的示例程序,可以单击或双击后拖动控件到窗体任何位置,鼠标移动到控件边沿可以改变光标形状,按下鼠标左键后拖动可以改变控件大小,改变主窗体大小控件大小跟随改变
可以在labview中动态的添加控件。其中的send.vi为发送程序,可以在运行时在receive.vi中添加一个字符串控件。
webform 异步加载用户控件DEMO
C#对控件类的 操作,使用代码段动态添加编程中需要的控件
C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习C#控件学习
C#134动态添加控件,动态删除控件 源代码
简单分页控件c#简单分页控件c#简单分页控件c#简单分页控件c#
下载即可使用, 简单易用,一句代码即可实现。 线程方式,占用内存资源少
C#创建可拖动的动态label控件
提供了一个C#中主窗体Panel中加载其他多个窗体Panel控件的办法
该资源为:C#控件使用与编程资料,如窗体间相互调用及数据传递方法、几种C#窗体间通讯的处理方法 等。
C#.NET串口通信控件C#_.NET常用控件C#_串口编程SerialPort控件文档资料(10个): 001.C#_SerialPort控件通信详细介绍.pdf 002.C#_串口编程SerialPort控件.doc 003.C#串口通信:MSComm控件使用详解.doc 004.C#_.net...
c#动态添加控件c#动态添加控件c#动态添加控件