?Put aside the fog and see the essence <>
解決問(wèn)題之前,要明白問(wèn)題為什么會(huì)出現(xiàn)
如果只想單純的解決這個(gè)問(wèn)題的話,直接把錯(cuò)誤復(fù)制然后百度就會(huì)出現(xiàn)很多很多解決方案
如果你想明白為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤
?
1、首先了解反射的機(jī)制
任何類庫(kù)編譯完成之后都會(huì)生成.dll文件,反射就是從當(dāng)前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll
2、我們來(lái)看一下程序的代碼和文件
web.config
DalFacoty代碼
我們找到web層的bin目錄下,查看一下所有的程序集
?很容易就會(huì)看出來(lái),web下的bin目錄并沒(méi)有DBZQ.Answer.Dal.dll
3、為什么沒(méi)有DBZQ.Answer.Dal.dll?
我們可以發(fā)現(xiàn)web/bin下有很多dll文件,就是沒(méi)有DBZQ.Answer.Dal.dll文件
為什么?
我們先看看程序中有多少層
?
然后和dll文件仔細(xì)對(duì)比一下,發(fā)現(xiàn)只有9個(gè)dll文件,少了兩個(gè)(DBZQ.Answer.Test和DBZQ.Answer.Dal)
DBZQ.Answer.Test只是我平時(shí)寫項(xiàng)目時(shí)做測(cè)試用的,沒(méi)有任何層調(diào)用了Test層,會(huì)不會(huì)和引用有關(guān)系?
然后我們仔細(xì)理一下調(diào)用關(guān)系
不難發(fā)現(xiàn),web層無(wú)論是直接還是間接,都引用了所有層,除了Dal層,這是我們就可以大膽的猜測(cè),可能是引用的關(guān)系
會(huì)心一笑,這有何難?接下來(lái)我就做了一件事
?
然后重新生成解決方案,打開(kāi)web/bin
?
嗯~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~????????
看來(lái)事情并沒(méi)有我想的這么簡(jiǎn)單,還是沒(méi)有DBZQ.Answer.Dal.dll
吶,為什么其他的層被web層間接引用了可以出現(xiàn).dll文件??而dal層不行
既然間接引用不行那我們直接引用試一下,先取消Factory層對(duì)Dal層的引用
重新生成解決方案
?
看來(lái)還是老大的引用最頂用
那這是為什么呢?為什么間接引用又不行了呢?
?仔細(xì)思考之下我想到了一個(gè)問(wèn)題,就是我其他的間接引用都是真正的要引用,因?yàn)槲乙玫狡渌麑拥暮瘮?shù)所以我要引用
并不只是添加一個(gè)引用,而是引用加調(diào)用
那我們?cè)賮?lái)嘗試一下,先取消web層對(duì)dal層的引用
然后同樣是工廠類,添加對(duì)Dal層的引用,重新生成解決方案
ok,不存在,我們嘗試著在DalFactory中聲明一個(gè)Dal層的對(duì)象試一下
重新生成解決方案?。。?br>
果然出現(xiàn)了
看來(lái)這個(gè)就是編譯機(jī)制的問(wèn)題,如果是直接引用,所引用的dll文件會(huì)直接出現(xiàn)在bin目錄下,
如果是間接引用,必須要有明確的調(diào)用代碼,才會(huì)將dll文件添加到bin文件加的目錄下,
接下來(lái)說(shuō)一下問(wèn)題最開(kāi)始的解決方案,就是缺少dll文件造成的
1、右鍵dal層,屬性-->生成-->輸出路徑 改為web/bin
2、將dal/bin/debug下的dll文件和pdb文件復(fù)制到web/bin
3、web直接添加對(duì)dll文件的引用(因?yàn)閷雍蛯又g的調(diào)用關(guān)系原因、我個(gè)人感覺(jué)不太好,僅僅只是個(gè)人感覺(jué))
雖然只是一個(gè)小問(wèn)題,百度一搜也很快可以解決,但是我還是想說(shuō)一句
解決問(wèn)題要明白問(wèn)題為什么會(huì)出現(xiàn),只有不斷的探索才能成長(zhǎng)
?
熱門工具 換一換
