`
water84222
  • 浏览: 377455 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

如何动态加载控件以及插件编程思想(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这种插件是怎么

实现的,但至少这种动态加载控件的方法实现插件编程的一个变通的方法。不是吗?我把一个功能模块做

成一个控件,然后在程序启动是扫描目录,即可获得所有的控件,当点击菜单是,将控件加载到窗体就行

了。我在母体程序里,我们所要做的只不过要一个容器窗口类来加载控件。当然,事先要有些约定,比如

说,控件有哪些可供调用的方法等等。


参考资料:

1. (C#)利用反射动态调用类成员  作者:   lizanhong

2.  在C#程序中实现插件架构  作者:Shawn Patrick Walcheske 译者:电子科技大学 夏桅

3. Building .NET Assemblies Dynamically  作者: Govinda 


 

分享到:
评论

相关推荐

    也许是目前最好用简单的分页控件

    描述中提到了“代码简单”和“C#开发”,这表明我们将关注的是C#编程语言环境下实现的分页控件。 在C#中,分页功能通常通过ADO.NET或Entity Framework等数据访问技术与ASP.NET MVC、WPF或WinForms等UI框架结合来...

    C# Winform斗地主游戏源码

    【C# Winform斗地主游戏源码】是一款基于C#编程语言和Windows Forms(Winform)框架开发的桌面游戏应用程序。它展示了如何利用.NET Framework和C#的强大功能来实现一款用户界面友好、功能完善的扑克牌游戏。在这个...

    基于C#+WinForm实现的职位职称管理系统源码

    通过分析和学习这个基于C# WinForm的职位职称管理系统源码,开发者不仅可以掌握C#语言的基本语法和面向对象编程思想,还能深入了解WinForm的事件驱动机制、数据库操作和UI设计,为自己的软件开发能力添砖加瓦。...

    毕业设计(论文)-基于C#实现音乐播放器功能

    7. **Visual Studio 2021**:这是一个强大的集成开发环境(IDE),支持C#以及其他.NET语言的开发。它提供代码编辑器、调试工具、版本控制集成以及项目模板等功能,使得开发者可以高效地构建音乐播放器应用。 8. **...

    华报智能报表工具

     报表文档和报表数据可以通过URL(或本地文件路径)请求从Web服务器(或本地操作系统)的返回结果中加载,可以从内存中的XML字符串加载,也可以通过编程(调用API编程接口)动态生成。 ReportAll控件/插件不依赖于...

    VS2010-MFC入门

    通过学习,开发者不仅可以掌握MFC的基本用法,还能了解Windows编程的基本思想,为进一步的C++ Windows应用开发打下坚实基础。不过,要注意的是,尽管VS2010已经有些年代,但MFC的基础知识仍然适用于后来的Visual ...

    Professional Visual Basic 2010 and .NET 4

    - **动态加载**: 如何动态加载和使用程序集。 - **.NET框架中的安全** (第32章): - **安全模型**: .NET框架中的安全模型。 - **权限集**: 如何定义和使用权限集。 - **安全最佳实践**: 安全方面的最佳实践和...

    NGUI练习项目源码

    《NGUI练习项目源码详解》 在游戏开发领域,Unity3D是一个广泛使用的引擎,其丰富的工具...虽然现在Unity3D已经内置了更先进的UI系统Unity UI(UGUI),但NGUI的历史地位和其背后的编程思想依然值得我们去学习和借鉴。

    编程及C&C++初学者 FAQ.pdf

    例如,Java、C#等现代编程语言在设计时受到了C/C++的影响。学习C/C++可以帮助你更容易地过渡到其他语言。 ##### 我为什么要学C/C++语言 C/C++是强大的编程语言,被广泛应用于系统软件、游戏开发、嵌入式系统等领域...

    战车

    C#是由微软公司开发的一种面向对象的编程语言,它被广泛用于构建Windows桌面应用、网页应用以及游戏开发,特别是Unity引擎中的游戏开发。 C#的特点包括: 1. **面向对象**:支持类、接口、继承、封装和多态等面向...

    ASP.NET源码——[博客空间]X2Blog v4.0.zip

    它基于.NET Framework,提供了一种高效、安全且易于使用的编程模型,使得开发者能够使用C#或VB.NET等语言快速构建功能丰富的web应用程序。 X2Blog v4.0是一款基于ASP.NET技术构建的博客系统,专为个人或组织提供...

    net 常见的面试题 (net)

    它是.NET框架的一个强大工具,常用于插件机制、动态加载类等场景。 - 序列化:将对象状态转化为可存储或可传输的格式,如XML、JSON,便于在网络间传输或持久化存储。反序列化是将这些格式恢复为对象。 5. **O/R ...

Global site tag (gtag.js) - Google Analytics