各位大虾,请看看我的代码由什么不妥,为什么不能正确运行?

yesry 2005-01-07 05:55:11
Parent 不能SetProperty?
string s="";
string r;
Assembly a = Assembly.LoadFrom("c:\\System.Windows.Forms.dll");//拷贝到此
//Get the type to use.
Type[] types=a.GetTypes();
foreach(Type t in types)
{
r=t.ToString();
s+=r;
}
//textBox1.Text=s;
//Get the method to call.

Type myType = a.GetType("System.Windows.Forms.TextBox");
Object obj = Activator.CreateInstance(myType);
foreach(PropertyInfo f in myType.GetProperties())
{
textBox1.Text+=f.ToString();
textBox1.Text+="\r\n";
}
myType.InvokeMember("Left",BindingFlags.SetProperty,null,obj,new object[]{0});
myType.InvokeMember("Top",BindingFlags.SetProperty,null,obj,new object[]{0});
myType.InvokeMember("Width",BindingFlags.SetProperty,null,obj,new object[]{100});
myType.InvokeMember("Height",BindingFlags.SetProperty,null,obj,new object[]{100});
//myType.InvokeMember("Show",BindingFlags.InvokeMethod,null,obj,null);
myType.InvokeMember("Parent",BindingFlags.SetProperty|BindingFlags.SuppressChangeType,null,obj,new object[]{this});

TextBox box=new TextBox();
box.Left=0;
box.Top=0;
box.Width=100;
box.Height=100;
box.Parent=this;
...全文
415 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
yesry 2005-03-24
  • 打赏
  • 举报
回复
唉,还是没有明白我的意图。我只知道dll的存在,"System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"是无法预料的,有可能是用户所写的dll,不一定是系统的类,这种调用方法行不通。
xixigongzhu 2005-03-24
  • 打赏
  • 举报
回复
Assembly a = Assembly.Load("System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
Assembly b = new TextBox().GetType().Assembly;
Console.WriteLine(a==b);

输出结果是true
所以用Assembly.Load("System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")就可以了
yesry 2005-03-24
  • 打赏
  • 举报
回复
哦,经过一番改进
string s="";
Object obj;
Type myType,myType2;

Assembly a = Assembly.LoadFrom("c:\\MyEdit.dll");//拷贝到此
myType = a.GetType("MyEdit.MyEdit");
s=myType.AssemblyQualifiedName;
myType2 = Type.GetType(s);
if(myType2==null)
{
obj = Activator.CreateInstance(myType);
}
else
{
obj = Activator.CreateInstance(myType2);
}
myType.InvokeMember("Left",BindingFlags.SetProperty,null,obj,new object[]{0});
myType.InvokeMember("Top",BindingFlags.SetProperty,null,obj,new object[]{0});
myType.InvokeMember("Width",BindingFlags.SetProperty,null,obj,new object[]{100});
myType.InvokeMember("Height",BindingFlags.SetProperty,null,obj,new object[]{100});
myType.InvokeMember("Parent",BindingFlags.SetProperty|BindingFlags.SuppressChangeType,null,obj,new object[]{panel1});
yesry 2005-03-24
  • 打赏
  • 举报
回复
经过实践,如果继承了TextBox做成的dll则没有问题。系统的dll反而出现了问题,这是为什么?
Assembly a = Assembly.LoadFrom("c:\\MyEdit.dll");//拷贝到此
//Get the type to use.
Type[] types=a.GetTypes();
foreach(Type t in types)
{
r=t.ToString();
s+=r;
}
//textBox1.Text=s;
//Get the method to call.

Type myType = a.GetType("MyEdit.MyEdit");
Object obj = Activator.CreateInstance(myType);
...

大虾,出手吧!

yesry 2005-03-23
  • 打赏
  • 举报
回复
没人看见了。
yesry 2005-02-25
  • 打赏
  • 举报
回复
改为
Control p;
p=this;
myType.InvokeMember("Parent",BindingFlags.SetProperty|BindingFlags.SuppressChangeType,null,obj,new object[]{p});


还是不行。
yesry 2005-02-25
  • 打赏
  • 举报
回复
换成Assembly.LoadFrom("C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.1.4322\\System.Windows.Forms.dll");
后结果一样。
yesry 2005-02-25
  • 打赏
  • 举报
回复
没有结果一样。
xixigongzhu 2005-02-25
  • 打赏
  • 举报
回复
yesry 2005-02-25
  • 打赏
  • 举报
回复
什么叫系统目录?
Assembly.LoadFrom("C:\\WINDOWS\\Microsoft.NET\\Framework\\v1.1.4322\\System.Windows.Forms.dll");

是系统目录吗?
xixigongzhu 2005-02-25
  • 打赏
  • 举报
回复
对于系统的某些dll拷贝出来使用可能就不正常了
==============================================
Assembly a = Assembly.LoadFrom("c:\\System.Windows.Forms.dll");
Type myType = a.GetType("System.Windows.Forms.TextBox");
Type t = new TextBox().GetType();
Console.WriteLine(t==myType);
这个输出的是False,为什么会这样呢?其实是因为这两种方式得到的类型不是同一个类型。
Assembly a = Assembly.LoadFrom("System.Windows.Forms.dll");这句从c:\\System.Windows.Forms.dll文件下载类型,其实在下载的时候是有缓冲的,也就是说这句话无论在程序里调用多次,得到的Assembly对象始终是同一个。而new TextBox().GetType()也有下载类型,但这个时候的Assembly是从.net系统目录下的dll文件下载的,与前一种方式得到的Assembly虽然内容一样,但不是同一个对象,所以导致里面的类型也不是同一个对象,这样当然就不会正常了。
yesry 2005-02-25
  • 打赏
  • 举报
回复
关键在于Type是Assembly.LoadFrom出来的。上述情况的确没有问题。Jim3(Jim) 已经说过了。
感谢2位。

我的主要思想是做一个桥接器,可以用其他程序使用,NET的类库。当然使用的时候得分析其中的所有可以使用的Perperty,Method,Event(PME),然后调用之.能列出所有的类库的方法我现在想到的是有先列出所有的dll,然后调用他们。

有否达到目的的有效方法?网上找资料又很少。
xixigongzhu 2005-02-25
  • 打赏
  • 举报
回复
不可能吧,下面的例子没有错呀:
class test:Control
{
public static void Main()
{
new test().TM();
}


public void TM() {
Type t = new TextBox().GetType();
Object obj = Activator.CreateInstance(t);
t.InvokeMember("Parent",BindingFlags.SetProperty|BindingFlags.SuppressChangeType,null,obj,new object[]{this});
}
}
yesry 2005-02-24
  • 打赏
  • 举报
回复
上述方案的问题在于,预先知道System.Windows.Forms.TextBox才行。我想轮训已知文件夹中所有的类库。
xixigongzhu 2005-02-24
  • 打赏
  • 举报
回复
Parent属性的类型是Control,楼楼是不是this不是Control类型的?
xixigongzhu 2005-02-24
  • 打赏
  • 举报
回复
不是绑定属性错误,错误的原因就在new object[]{this}这个参数值。

InvokeMember这个方法并不是就根据名字去找成员的,而是根据名字、参数的个数和类型、返回值(如果有)来找成员的,而由于this的类型不正确,名字为Parent参数为this类型的属性肯定就不会找到了,所以才会出异常
xixigongzhu 2005-02-24
  • 打赏
  • 举报
回复
首先取得Winform的assembly这样就可以了:
Assembly a = new TextBox().GetType().Assembly;

不知道楼主定义这段代码的类是否是控件
xixigongzhu 2005-02-24
  • 打赏
  • 举报
回复
绑定属性错误呢
Jim3 2005-02-24
  • 打赏
  • 举报
回复
明白你的意思

反射这么写肯定没错,可能是加载了两个System.Windows.Forms.dll导致的问题

暂时帮不到你,我会继续找资料看看,你如果有什么结果了,也请告诉大家

谢谢
Jim3 2005-02-23
  • 打赏
  • 举报
回复
不清楚是什么原因,不过你这么改一下就可以了
把这句去掉
Assembly a = Assembly.LoadFrom("c:\\System.Windows.Forms.dll");//拷贝到此

用下面这句得到类型
Type myType = Type.GetType(
"System.Windows.Forms.TextBox, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");

对于系统的某些dll拷贝出来使用可能就不正常了

有谁知道原因的说一下,我也想知道
加载更多回复(12)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧