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

    技术2022-05-11  77

    关键词:动态加载,控件,插件

           控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员

    调用,更重要的是它还可以实现插件式开发,使软件的灵活性、可扩充性大大增强。在网络上,也有很多

    动态加载控件、动态调用类成员等的资料。下面,我就将动态加载控件总结一下,以供大家参考。(不过

    由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为

    朋友看到我的不足,给我提出宝贵意见)一、动态加载控件       动态加载,最基本用到的就是反射机制。在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.InvokeMemberpublic 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 

     


    最新回复(0)