• 关于反射的两个棘手问题


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

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

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

  • 相关阅读:
    [C++知识点]2015.4.18
    [COCOS2DX]第一个开源项目的部署和运行<win32版本>
    [COCOS2DX]交叉编译实践+速度优化(vs2012修改win32代码+修改makefile+编译安卓项目包+部署安卓项目包到Eclipse+运行apk)
    [COCOS2DX]COCOS命令新建项目+编译安卓项目并成功运行
    [COCOS2DX]官网helloworld在VS2012中的部署
    【转】int const A::func()和int A::func() const
    【转】Singleton单例模式
    【转】java静态代码块和构造方法执行顺序
    小程序加入阿拉丁统计
    关于固定footer的用法
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/2741282.html
Copyright © 2020-2023  润新知