在机房合作的过程中,在工厂中使用反射机制返回D层类对象时再次出现了无法获取类文件,就是说返回的类为nothing,如图:
可事实上,在个人重构时,我用的同样代码,而没有任何问题,在这里,却突然报错,为什么?
第一反应就是D层的生成路径可能有问题,可是改了以后,还是不对,可是曾经自己对反射机制是做过一定了解的—《七层连连串》。现在却一头雾水,没办法,还是找根源吧,所以找到反射的书写格式:
Assmbly.Load("程序集名称").CreateInstance("命名空间.类名称"),Assmbly类
Assmbly类作用:动态的加载程序集信息;程序集就是该类在UI/BIN/Debug中编译生成的.dll和.exe文件.
CreateInstance类作用:创建类的实例
至于“程序集”和“命名空间”两个名词上,特需理解清楚。
命名空间就相当于电脑中的一个文件夹,只是这个文件夹中放的不是文件,而是类;目的在于归类,避免相同的文件夹在一个命名空间里。
而在VS中创建一个项目时,会指定一个名称,就自己刚开始输入的名称,这也就是程序集名称,而此时会将命名空间默认设置为这个名称,换句话说,如果在没有任何更改的情况下,程序集名称和命名空间是 一样的,这也就是为什么在个人重构中没有出现任何问题:原因就是你是创建的一个解决方案,在该方案中添加的一个个的项目(例:UI,BLL,DAL等),而该项目的程序集名称和命名空间是默认生成一样的,所以这样的代码没有任何问题;而为什么在合作中出现问题,因为EA软件生成的代码框架中引入了命名空间,所以现在项目中的命名空间名称变了,那么CreateInstance(className)中className就有问题了,解决方案在最后的代码里。
知道了程序集和命名空间都是什么了,那它们之间的关系又是怎么样的呢!一个复杂的系统是要由多个项目共同完成的,它们都存在于一个解决方案中。其中的每一个项目,既程序集,它可以包含多个命名空间,同时一个命名空间也可以包含多个程序集,所以,没有什么关系可以,唯一可以联系的也就是默认命名空间名称与程序集名称是一样的而已。
以上问题的解决方案:
''' <summary> ''' 创建基本数据表接口 ''' </summary> Public Function CreateIBasicData() As IBasicData Dim Ibasic As IBasicData Dim spaceName As String = "DAL.Package.DAL" Dim className As String = spaceName + "." + "BasicDataDAL" Ibasic = CType(Assembly.Load("DAL").CreateInstance(className),IBasicData) Return Ibasic End Function