none
請問如何取得有加入參考的專案組件? RRS feed

  • 問題

  • 各位前輩好,我練習的範例中有三個專案,


    專案相依性為:

    Console 專案參考 Interfaces 專案 與 ImplClass 專案,

    ImplClass 專案參考 Interfaces 專案,

    接著我想取得 Console 有參考的專案所有組件,

    但 Console 專案的代碼沒有使用到與 ImplClass 有關的物件,

    故我使用下述方法想取得 ImplClass 組件無法找到,

                var assemblies = AppDomain.CurrentDomain.GetAssemblies();
                foreach (var assembly in assemblies.OrderBy(x=>x.FullName))
                {
                    System.Diagnostics.Debug.WriteLine(assembly.FullName);
                }

    請問要如何在 Console 專案中,取得 ImplClass 組件?

    2017年8月14日 下午 02:39

解答

  • DLL 和 exe 放在一起的話,那你就可以先把所有的 DLL 都抓出來 (用 System.IO.Directory.GetFiles()),用 Assembly.Load() 載進來,再交由 DI 去處理不就好了...

    AppDomain.CurrentDomain.GetAssemblies() 只會取得已載入記憶體的組件,沒載入的要自己處理。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 503 2017年8月15日 上午 02:47
    2017年8月15日 上午 12:50
    版主

所有回覆

  • https://msdn.microsoft.com/zh-tw/library/system.reflection.assembly.getreferencedassemblies.aspx

    不過這不一定準,因為編譯器可能會將未使用的參考組件移除,以加速載入速度與增加記憶體使用效率:

    https://stackoverflow.com/questions/3433973/getreferencedassemblies-doesnt-return-all-assemblies

    所以最好是確實有使用到它,這樣才能抓得到。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2017年8月14日 下午 02:45
    版主
  • 感謝,這個我也試過,的確他會移除,也抓不到 ImplClass 組件
    2017年8月14日 下午 02:47
  • 實際上可能很多這種實作類別的專案,我想如果能只有加入專案的話,

    不用在註冊服務的地方還要修改代碼就方便很多,不知道是否還有其他方法?

    2017年8月14日 下午 02:59
  • 註冊服務? 你是指 DI 嗎?

    有些 DI Framework 也有提供方便的作法,像直接搜尋組件內的介面與實作對應。

    但至少你要確認組件有存在於指定的位置 (例如和 exe 放在一起),組件不在就算 DI Framework 有提供方法也沒輒。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    2017年8月14日 下午 03:27
    版主
  • 對,我目前只先用 ASP.NET Core 內建的 DI,

    所以自己寫搜尋所有參考組件相關的服務功能,

    目前能確定 dll 都會跟 exe 放在一起。

    2017年8月14日 下午 03:34
  • DLL 和 exe 放在一起的話,那你就可以先把所有的 DLL 都抓出來 (用 System.IO.Directory.GetFiles()),用 Assembly.Load() 載進來,再交由 DI 去處理不就好了...

    AppDomain.CurrentDomain.GetAssemblies() 只會取得已載入記憶體的組件,沒載入的要自己處理。


    強力監督SQL Injection問題!!

      • 小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
      • 雲端學堂Facebook: http://www.facebook.com/studyazure

    • 已標示為解答 503 2017年8月15日 上午 02:47
    2017年8月15日 上午 12:50
    版主
  • 如果要自行載入,

    我自己也是使用 System.IO.Directory.GetFiles() +Assembly.Load(),

    自己寫 Reflection 去操作自行載入的 DLL。

     Reflection 的寫法,可以參考:使用反射執行方法的7種方式

    理直氣和,切記。

    個人

    2017年8月15日 上午 01:45
  • 感謝,我原本也是嘗試 Assembly.Load(dll path),但發現直接呼叫就出現 Exception: 

    發生 System.IO.FileLoadException  HResult=0x80131047  Message=無法載入檔案或組件

    我以為不能這樣,但經小朱提醒後,我在嘗試一次,這次想起這個例外錯誤應該指的是我傳錯組件名稱,

    查詢一下後,Assembly.LoadFrom() 才能用於載入 dll 路徑,這樣就能解決問題,感謝。

    2017年8月15日 上午 02:47