关于反射的两个棘手问题

 为了软件的复用性和灵活性,我们不免要用到很多技术,比如设计模式、配置文件、反射等等等等,我也出于这个目的用了用经典的三层架构+简单工厂+配置文件+反射的架构方法,架构图如下:

     但是当我在做到反射的时候,遇到了两个非常棘手的问题,总也反射不成功,现对这两个错误的处理方式和大家共同分享和探讨一下。

     错误一:“未能加载文件或程序集"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层右击属性,把程序集名称中去掉解决方案名称;并在反射中的类名称中去掉解决方案名称。

原文地址:https://www.cnblogs.com/weihengblogs/p/2741282.html