zoukankan      html  css  js  c++  java
  • 关于反射的两个棘手问题

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

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

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

  • 相关阅读:
    图论 拓扑排序
    图论 k短路
    图论 最短路 spfa
    12.14 操作系统实验:linux虚拟机与进程管理
    Anaconda 换用清华园后安装速度依然很慢,或者安装包出错
    6.21 在panel中设置背景并不覆盖控件--paintComponent
    1.15 关于String类型和其他主数据类型相互转换的方法 (转)
    1.14 Headfirstjava第五章 简单游戏代码
    1.14 HeadFirstJava 前六章读书笔记总结
    1.22训练赛 --ac2
  • 原文地址:https://www.cnblogs.com/weihengblogs/p/2741282.html
Copyright © 2011-2022 走看看