使用抽象工廠反射獲取不到Dal層對象,未能載入文件或程式集……

  • 2019 年 10 月 3 日
  • 筆記

 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文件的引用(因為層和層之間的調用關係原因、我個人感覺不太好,僅僅只是個人感覺)

雖然只是一個小問題,百度一搜也很快可以解決,但是我還是想說一句

解決問題要明白問題為什麼會出現,只有不斷的探索才能成長