为了软件的复用性和灵活性,我们不免要用到很多技术,比如设计模式、配置文件、反射等等等等,我也出于这个目的用了用经典的三层架构+简单工厂+配置文件+反射的架构方法,架构图如下:
但是当我在做到反射的时候,遇到了两个非常棘手的问题,总也反射不成功,现对这两个错误的处理方式和大家共同分享和探讨一下。
错误一:“未能加载文件或程序集"Dal"或它的某一个依赖项。系统找不到指定文件。”
错误分析:这个错误是在告诉我们,Dal层的dll文件没有找到,可明明在解决方案中有这层,并且在物理磁盘······\Dal\bin\Debug下有Dal.dll这个文件。
最后发现系统运行时,它默认是在······\UI\ChargingSystem\bin\Debug这个文件夹下去搜寻需要的dll文件的,一般默认UI为主目录,也就是指窗体所在的为那个包,也有可能是以解决方案为名称的一个包。
解决方案:在······\UI\ChargingSystem\bin\Debug这个文件夹中手动将DAL文件夹下有关DAL的三个文件拷贝了进去就可以了,
但这种手动拷贝非常的麻烦,因为只要你稍微改动DAL层就得重新拷贝,需要保证模板和源文件一致。
另一个解决方案:直接在DAL层上右击选属性,在属性----编译----把生成输出路径改到UI这个文件夹的debug目录下就OK了,这里别忘了自己正在用的是Debug版本还是Release版本,如果是Release版本则把路劲设置到Release文件夹下。
错误二:“未将对象引用设置到对象的实例”
错误分析:这是由程序集名称和类名命名错误造成的,程序集名称一般有两种,一种是解决方案+程序集名称,如ChargingSystem.Dal,另一种是直接写Dal,省去解决方案名称;这两种写法都是可以的。
但是在反射中类名还挺讲究,反射实例化一个类的时候类名需要:程序集名称+类名,如下图:
在图中可以看出className为类名称,strAssembName为程序集名称;其中这个程序集名称必须要省去解决方案名称,也就是只有Dal,如果类名称中出现解决方案名称就会出现如上的错误(仅限于vb.net中)。
解决方案:在Dal层右击属性,把程序集名称中去掉解决方案名称;并在反射中的类名称中去掉解决方案名称。