zoukankan      html  css  js  c++  java
  • 使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......

     Put aside the fog and see the essence

    解决问题之前,要明白问题为什么会出现

    如果只想单纯的解决这个问题的话,直接把错误复制然后百度就会出现很多很多解决方案

    如果你想明白为什么会出现这个错误

    1、首先了解反射的机制

    任何类库编译完成之后都会生成.dll文件,反射就是从当前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll

    2、我们来看一下程序的代码和文件

    web.config

    DalFacoty代码

    我们找到web层的bin目录下,查看一下所有的程序集

     很容易就会看出来,web下的bin目录并没有DBZQ.Answer.Dal.dll

    3、为什么没有DBZQ.Answer.Dal.dll?

    我们可以发现web/bin下有很多dll文件,就是没有DBZQ.Answer.Dal.dll文件

    为什么?

    我们先看看程序中有多少层

     

    然后和dll文件仔细对比一下,发现只有9个dll文件,少了两个(DBZQ.Answer.Test和DBZQ.Answer.Dal)

    DBZQ.Answer.Test只是我平时写项目时做测试用的,没有任何层调用了Test层,会不会和引用有关系?

    然后我们仔细理一下调用关系

    不难发现,web层无论是直接还是间接,都引用了所有层,除了Dal层,这是我们就可以大胆的猜测,可能是引用的关系

    会心一笑,这有何难?接下来我就做了一件事

    然后重新生成解决方案,打开web/bin

     

    嗯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~????????

    看来事情并没有我想的这么简单,还是没有DBZQ.Answer.Dal.dll

    呐,为什么其他的层被web层间接引用了可以出现.dll文件??而dal层不行

    既然间接引用不行那我们直接引用试一下,先取消Factory层对Dal层的引用

    重新生成解决方案

     

    看来还是老大的引用最顶用

    那这是为什么呢?为什么间接引用又不行了呢?

     仔细思考之下我想到了一个问题,就是我其他的间接引用都是真正的要引用,因为我要用到其他层的函数所以我要引用

    并不只是添加一个引用,而是引用加调用

    那我们再来尝试一下,先取消web层对dal层的引用

    然后同样是工厂类,添加对Dal层的引用,重新生成解决方案

    ok,不存在,我们尝试着在DalFactory中声明一个Dal层的对象试一下

    重新生成解决方案!!!

    果然出现了

    看来这个就是编译机制的问题,如果是直接引用,所引用的dll文件会直接出现在bin目录下,

    如果是间接引用,必须要有明确的调用代码,才会将dll文件添加到bin文件加的目录下,

    接下来说一下问题最开始的解决方案,就是缺少dll文件造成的

    1、右键dal层,属性-->生成-->输出路径 改为web/bin

    2、将dal/bin/debug下的dll文件和pdb文件复制到web/bin

    3、web直接添加对dll文件的引用(因为层和层之间的调用关系原因、我个人感觉不太好,仅仅只是个人感觉)

    虽然只是一个小问题,百度一搜也很快可以解决,但是我还是想说一句

    解决问题要明白问题为什么会出现,只有不断的探索才能成长

  • 相关阅读:
    日志
    设置和开启定时器
    缓存管理
    计算机程序员能做多久,这个行业有年龄限制吗?
    程序员都是怎么工作的?
    做程序员怎么样?
    javascript中this关键字
    1003. 二哥养细菌—java
    1002. 二哥种花生——java
    this与static
  • 原文地址:https://www.cnblogs.com/ckka/p/11331037.html
Copyright © 2011-2022 走看看