1. 程式人生 > >使用抽象工廠反射獲取不到Dal層物件,未能載入檔案或程式集......

使用抽象工廠反射獲取不到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