| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 593 人关注过本帖, 1 人收藏
标题:dll里能创建控件吗
只看楼主 加入收藏
coffce460
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-12-8
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:3 
dll里能创建控件吗
关于插件,想在主程序加载插件dll后创建一个控件,可以在dll里实现为主程序创建控件吗

[ 本帖最后由 coffce460 于 2010-12-8 19:43 编辑 ]
搜索更多相关主题的帖子: 主程序 
2010-12-08 19:22
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:10 
在程序中创建控件?

出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-12-09 08:22
程诗亮
Rank: 2
等 级:论坛游民
帖 子:6
专家分:10
注 册:2010-12-8
收藏
得分:10 
这个是可以的
2010-12-14 12:45
wangnannan
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:87
帖 子:2546
专家分:9359
注 册:2007-11-3
收藏
得分:0 
一、动态加载控件
       动态加载,最基本用到的就是反射机制。在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这种插件是怎么实现的,但至少这种动态加载控件的方法实现插件编程的一个变通的方法。不是吗?我把一个功能模块做成一个控件,然后在程序启动是扫描目录,即可获得所有的控件,当点击菜单是,将控件加载到窗体就行了。我在母体程序里,我们所要做的只不过要一个容器窗口类来加载控件。当然,事先要有些约定,比如说,控件有哪些可供调用的方法等等。


出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
2010-12-15 08:19
快速回复:dll里能创建控件吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023693 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved