天天看點

DALFactory出現"未能加載檔案或程式集“DAL”或它的某一個依賴項。系統找不到指定的檔案”的解決方案 .

     自己在使用抽象工廠+配置檔案+反射實作重構機房的過程中,遇到了這種情況,

DALFactory出現"未能加載檔案或程式集“DAL”或它的某一個依賴項。系統找不到指定的檔案”的解決方案 .

當初自己認真的檢查了反射中的代碼,都是沒有問題,請教了師姐,檢查了抽象工廠與反射的使用都沒有問題

Private Shared ReadOnly AssemblyName As String = "DAL" '資料程式集名稱
    Private Shared ReadOnly db As String = System.Configuration.ConfigurationSettings.AppSettings("DB")
    Public Function CreateUser() As [Interface].IUser

        Dim ClassName As String = "DAL" + "." + db + "User"

        Dim User As IUser '定義接口
        '反射執行個體化()
        User = CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), IUser)
        Return User
           

後來在網上找到了類似的問題的解決方案解決了,提示很明顯是缺少DLL,原因:

          1:DLL檔案名與加載時的DLL檔案名不一緻。

          2:.DLL檔案根本不存在,即出現丢失情況。

         3.:加載DLL路徑錯誤,即DLL檔案存在,但加載路徑不正确

我查了自己項目的情況:

    檔案名一緻,在UI層沒有查找到生成的關于D層的Dll檔案,程式運作的機制是在啟動層的bin檔案夾下的debug裡面必須得有别的程式集生成的dll檔案,程式在運作時會直接在啟動的這一層裡面直接的調用所需要的dll檔案,後來自己把有關的D層生成的dll手動添加了進去,在運作,沒有錯誤了;但是這樣還是不行的畢竟後期還需要做大量的工作,總不能每次都需要手動吧,後來才知道原來可以調整程式的生成路徑:

DALFactory出現"未能加載檔案或程式集“DAL”或它的某一個依賴項。系統找不到指定的檔案”的解決方案 .

     這樣對于這個問題就解決掉了,學習到很多知識:

     反射的一個原則:一切皆以UI層的bin檔案夾中的dll名稱為中心。(原因很簡單:.net類加載的機制就是預設從本程式集的bin檔案中找,是以bin檔案夾中一定要有要加載的程式集的dll)。UI層中bin檔案夾中dll叫什麼名字AssemblyPath就使用什麼名字,bin内部類的全名叫什麼,className就寫成什麼全名。.net中的引用:加入對某個程式集的引用就能在程式集有變化時自動拷貝dll。

發現問題:自己搜尋的時候還是有些偏差,今後多多鍛煉。

總結:遇見問題是很正常的,是自己不斷前進的階梯,踏踏實實的解決問題才是最重要的

後期對反射的思考與學習:

    雖然抽象工廠模式是為解決資料庫更換而設計的,但操作不同資料庫到底有些什麼不同目前尚不十厘清楚,除了連結字元串上有差別,還知道Sql Server和Access等在ADO.NET上的使用是不同的,Sql Server用的是System.Data.SqlClient命名空間下的SqlConnection、SqlCommand、SqlParameter、SqlDataAdapter、SqlDataReader等,而Accesss資料庫則是用的System.Data.OleDb命名空間下相應的類。此外可能對不同資料庫進行操作時SQL語句有些不同吧?!

    對現在正在設計的機房收費系統,如果不同資料庫之間的SQL語句沒差別,那麼現在所寫的繼承資料表處理接口的資料表處理類就不必在更換資料庫時被替換。也就是反射的應用就沒有必要了,因為反射在這的作用就是動态的産生資料庫處理類(根據條件産生處理Sql Server或其他資料庫的處理類,而這些資料庫處理類用的就是SQL語句)。

    對這個模式應用的整體感覺是試着應用上了模式來解決資料庫更換帶來的問題,但究竟解決了沒有,解決徹底否尚有很大疑問……

繼續閱讀