近来刚好在看一些关于反射的东西,之前一直没用过,真是惭愧,后来看了些资料后,觉得好像也不怎么难,就一句话:
Assembly.Load(Assembly.GetExecutingAssembly().FullName).CreateInstance(Namespace + "." + ClassName);就搞掂了,
但是很多貌似简单(或许真的是很简单吧)的问题就搞了我很久,就是关于那个程序集的问题,一开始的时候,
只是知道Assembly.Load("程序集名")这个,只是知道用Assembly.GetExecutingAssembly().FullName这可以拿到了,
看似一切都是那么的简单,但是当我在调试时,却发现我反射不出那个类,找了些资料才知道,原来是程序集出了问题了.
正确点来说,是我用错了程序集,对于很多新人来说,或是刚接触的反射的来说,可能并不怎么了解那些程序集是怎么一回事.
我做了测试后得出:
1.类
所有的类是在同一个程序集中,所有的类都在App_Code的文件夹下(默认),在App_Code里,不管你分几个文件夹存放那些类,不管
类中有多少个namespace,都只有一个程序集.
2.用户控件
每一个UserControl属于不同的程序集,不管你是否放在同一个文件夹里.
3.页面
每一个不同的页面都属于同一个程序集.不管程序代码的命名空间是否一致.在运行时,所有页面的命令空间会默认显示
为"ASP",而你加的命名空间,则和页面的名字加起来统称为基类名了.
关于反射Assembly.Load("程序集").CreateInstance("命名空间.类"),而不管在哪一层写这段代码其中的("程序集")
读取的实际是web层bin文件夹下的dll,也就是说你反射的类的程序集dll在web层的bin下必须有,当我们的程序运行或发布时,.Net工具会自动
的添加当前项目的类的dll,页面的dll,还有用户控件的dll.
注意CreateInstance()一定是命名空间.类名,否则创建的实例为空
Assembly.Load("程序集名")
Assembly.LoadFrom("程序集实际路径")
希望我这些总结可以给那些刚入门的朋友一点帮助,本人才疏学浅,要是有什么不对的地方,还忘朋友倍们指出.
在此赋上我的测试代码.Reflect程序集测试例子 ,大家下载后,用VS中打开后,可以直接浏览default,和default2这两个页面,并做些对比,相信这时你会明白很多.