使用抽象工廠反射獲取不到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檔案的引用(因為層和層之間的呼叫關係原因、我個人感覺不太好,僅僅只是個人感覺)
雖然只是一個小問題,百度一搜也很快可以解決,但是我還是想說一句
解決問題要明白問題為什麼會出現,只有不斷的探索才能成長
&n