现在有一主面板,它需要动态加载用户控件. 代码如下:
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() 都得不到我想要的方法,和接口. 在网络上查了很久,没找到答案,在此向大家学习.本人分不多,希望大家不吝赐教
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() 都得不到我想要的方法,和接口. 在网络上查了很久,没找到答案,在此向大家学习.本人分不多,希望大家不吝赐教
解决方案 »
- 未将对象引用设置到对象的实例,问题求解
- C#实现二级域名源码下载
- C# 如何屏蔽 Win 组合键
- 求救啊~~郁闷好久了
- dataGrid内容清空
- 关于Datagrid:焦点落在Datagrid的时候填充数据会出错!!!
- 第一次写程序 编译错误。。。 求教 无从下手啊
- 精简版 compact c#(winform ) 如何在datagrid中加一列checkbox
- c#的windows应用程序中为什么会有Form1.Designer.cs、Form1.cs、Program.cs三个文件????
- 奇怪的问题,请大家来看看!
- 2星以下不要进 - 未将对象引用设置到对象的实例
- WindowsMediaPlayer控件
Type type = asm.GetType(clsName); //clsName是命名空间.用户控件类名
//调用带参构造(字符串类型的构造)
object obj = Activator.CreateInstance(type, new object[] { "abcd" });
//调用方法
object result = type.GetMethod("GetValue").Invoke(obj, null);用户控件的带参构造是什么类型,在你的程序集中是否存在引用?
如果有引用,直接new一个就可以传递。
没有就只能通过反射创建一个。实例化的方式和上面的代码类似。
public UserControl1(string ipb)
{
_ipb = ipb;
}根据Activator.CreateInstance(type, new object[] { "abcd" }); 执行报错..找不到该类型上的构造函数
type {Name = "UserControl1" FullName = "WindowsFormsControlLibrary1.UserControl1"}
直接引用string asmFile所指向的dll到你的项目。查看对象浏览器,看看UserControl1有没有带字符串参数的构造,有没有GetValue方法。
这样做 直接NEW 就解决问题了.
我采用的解决方案是 将多人开发的用户控件的DLL放入到一个文件夹下. 我的主程序读取该目录下的所有DLL文件,通过反射,在根据用户的选择 相应加载不同的用户控件..
要注意修饰符的问题,UserControl1是否有public,GetValue方法是否有public
另外我做了一个测试,就是将外部的DLL引入到项目中 ,确实可以实现, 不引入则不行.. 这个比较郁闷.
dll路径 命名空间.类名 是不是都对。访问修饰符是不是public
似乎没有其他可能造成反射调用失败的。