现在有一主面板,它需要动态加载用户控件. 代码如下:
string asmFile = System.IO.Path.GetFullPath("WindowsFormsControlLibrary1.DLL");
System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(asmFile);
Type type = asm.GetType(path);
UserControl uc= (UserControl)System.Activator.CreateInstance(type);
uc.Dock = DockStyle.Fill;
tabControl1.TabPages[1].Controls.Add(uc);//tabControl1 是主面板中的选项卡控件该用户控件实现了自定义接口
 public interface IControlRun 
{
  Object GetValue();      
  void SetValue(Object o);
}问题1: 如何调用UserControl 有参数的构造函数. 我试过使用Activator.CreateInstance(type,new Object[]{o}); 这个办法去传入参数, 编译器提示找不到这个参数.
问题2: 如何在主面板中调用 用户控件实现的getvalue 和 setvalue 这两个方法. 我试过使用 uc.getType().GetMethods()
以及uc.GetType().GetInterfaces() 都得不到我想要的方法,和接口. 在网络上查了很久,没找到答案,在此向大家学习.本人分不多,希望大家不吝赐教

解决方案 »

  1.   


            Type type = asm.GetType(clsName); //clsName是命名空间.用户控件类名 
            //调用带参构造(字符串类型的构造)
            object obj = Activator.CreateInstance(type, new object[] { "abcd" });
            //调用方法
            object result = type.GetMethod("GetValue").Invoke(obj, null);用户控件的带参构造是什么类型,在你的程序集中是否存在引用?
    如果有引用,直接new一个就可以传递。
    没有就只能通过反射创建一个。实例化的方式和上面的代码类似。
      

  2.   

     object result = type.GetMethod("GetValue").Invoke(obj, null);  这里GetValue这个方法是用户控件实现了接口的方法 所以用type.GetMethod("GetValue")是无法获取到的, 如果能通过 type获取到接口那问题就OK了,但我用GetInterfaces(接口名) 得到的确实NULL值 .这是一构造函数.
     public UserControl1(string ipb)
    {
        _ipb = ipb;
    }根据Activator.CreateInstance(type, new object[] { "abcd" }); 执行报错..找不到该类型上的构造函数
      

  3.   

    你的type是不是搞错了?你确认是那个UserControl1吗?
      

  4.   

    我已经在主面板中加载了 用户控件 ,所以那个TYPE 肯定是用户控件
    type  {Name = "UserControl1" FullName = "WindowsFormsControlLibrary1.UserControl1"} 
      

  5.   

    如果类型没错,要确认dll没有问题。
    直接引用string asmFile所指向的dll到你的项目。查看对象浏览器,看看UserControl1有没有带字符串参数的构造,有没有GetValue方法。
      

  6.   

    如果这样 就必须规定,别人开发的用户控件就必须在 XXX.DLL下, 因为我需要把XXX.DLL引入到程序
    这样做 直接NEW 就解决问题了. 
    我采用的解决方案是 将多人开发的用户控件的DLL放入到一个文件夹下. 我的主程序读取该目录下的所有DLL文件,通过反射,在根据用户的选择 相应加载不同的用户控件.. 
      

  7.   

    我只是让你测试dll有没有问题。
    要注意修饰符的问题,UserControl1是否有public,GetValue方法是否有public
      

  8.   

    查过了,没有问题.
    另外我做了一个测试,就是将外部的DLL引入到项目中 ,确实可以实现, 不引入则不行.. 这个比较郁闷.
      

  9.   

    你在仔细检查反射调用的代码吧。
    dll路径 命名空间.类名 是不是都对。访问修饰符是不是public
    似乎没有其他可能造成反射调用失败的。