none
動態指定同名同Version但實際上邏輯不同的dll RRS feed

  • 問題

  • 各位好,最近遇到動態指定dll的問題,說明如下:

       1.先說明現在的系統架構:

          目前現行系統是WinForm,假定叫Menu系統。會使用ClickOnce的機制發佈到使用者電腦,系統啟動後當使用者點選某個子系統,會依據子系統名字建立資料夾到Menu系統同層,並從某個伺服器將所選子系統的相關dll放到該資料夾

          在Win7中ClickOnce安裝路徑在「%userprofile%\AppData\Local\Apps\2.0\亂數組成的資料夾\亂數組成的資料夾\」下(系統有勾選用戶端可在離線時使用應用程式)

          該路徑下系統相關資料夾會長成像這樣:

             Menu系統資料夾:Menu.exe

             A系統資料夾:A.dll、Common.dll

             B系統資料夾:B.dll、Common.dll

          A與B系統的Common.dll同名且同Version,我們開發都是1.0.0.0不會變,但是裡面的邏輯可能不同(1個比較新可能有新的method、1個較舊)

          因為A系統與B系統是不同開發者,但是Common.dll的程式是所有開發者都可以撰寫異動

          這樣的架構是希望當Menu執行A系統時是使用A系統資料夾的Common.dll,當Menu執行B系統時是使用B系統資料夾的Common.dll

          這樣當我A系統有新功能且會異動Common.dll時,上傳伺服器時只會上傳到A系統資料夾,B系統資料夾的Common.dll並不會異動(怕原本可以正常跑的變不正常)

       2.相關Code:

           當使用者點選A系統

    		System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(@"..\A系統資料夾\A.dll");
    		Type t = asm.GetType(略);
    		DockContent dc = (DockContent)Activator.CreateInstance(t);
    		dc.Show(略);

          以上簡碼主要是使用Assembly.LoadFrom讀取A系統資料夾的A.dll。然後使用WeifenLuo.WinFormsUI.Docking這個元件show在畫面上(這個元件寫WinForm的應該常常用到吧?)

          不過因為是使用LoadFrom,所以相依Common.dll也會一起Load(可以解讀為被JIT轉成機器碼然後放到快取區嗎?)

          然後當使用者用完A系統要繼續用B系統的時候:

    		System.Reflection.Assembly asm = System.Reflection.Assembly.LoadFrom(@"..\B系統資料夾\B.dll");
    		Type t = asm.GetType(略);
    		DockContent dc = (DockContent)Activator.CreateInstance(t);
    		dc.Show(略);

          B系統實際上使用的Common.dll還是A系統資料夾的,因為A系統資料夾的之前已Load,而LoadFrom會判斷如果之前已載入Common.dll,則回傳之前的Common.dll(可以解讀為機器碼快取區已有Common.dll的機器碼,所以除非UnLoad否則不能替換?)

      3.希望的解決:

          使用者在執行Menu系統時,畫面上有可能同時會有A系統跟B系統(不同的DockContent),是否有辦法在A系統的DockContent使用的是A系統的Common.dll,而B系統的DockContent使用的是B系統的Common.dll?

    希望各位可以給我個方向,小至語法大致開發模式都可以,謝謝!


    • 已編輯 Wilson Fang 2013年2月5日 上午 09:22 排版
    2013年2月5日 上午 08:49

解答

  • http://www.codeproject.com/Articles/13985/NET-Based-Add-in-Plug-in-Framework-with-Dynamic-T

    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

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

    2013年2月7日 上午 12:57
    版主

所有回覆

  • 只要把 Common.dll 以不同模組方式命名,就可以解決這個問題了。

    另外,程式中的命名空間最好也是分開命名,但共用相同的介面,這樣可以降低相依性。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

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

    2013年2月6日 上午 01:05
    版主
  • 只要把 Common.dll 以不同模組方式命名,就可以解決這個問題了。

    另外,程式中的命名空間最好也是分開命名,但共用相同的介面,這樣可以降低相依性。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

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

    Hi 小朱

    不太懂不同模組方式命名的意思

    請問你的意思是這篇文章的概念?

    C# 動態載入DLL模組


    2013年2月6日 上午 03:55
  • A Developer -> A.Common.dll (namespace Project.A.Common)

    B Developer -> B.Common.dll (namespace Project.B.Common)

    不同開發者使用相同的命名空間和類別名稱本來就是大忌,除非他們寫的功能是完全相同的。

    另外,對外的介面最好是統一,這也是為什麼我前面寫使用介面 (interface) 的原因。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

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

    2013年2月6日 上午 08:23
    版主
  • A Developer -> A.Common.dll (namespace Project.A.Common)

    B Developer -> B.Common.dll (namespace Project.B.Common)

    不同開發者使用相同的命名空間和類別名稱本來就是大忌,除非他們寫的功能是完全相同的。

    另外,對外的介面最好是統一,這也是為什麼我前面寫使用介面 (interface) 的原因。


    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

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

    Common.dll是個畫面元件,裡面包含了選員工、選部門等等的共用UserControl

    所以A Developer與B Developer都有Common的專案(使用VSS版本控管),也可以在裡面新增新的畫面元件或修改舊的畫面元件

    所以如果分成Project.A.Common與Project.B.Common不太適合

    即使如此,仍可以使用interface來解?

    2013年2月6日 上午 08:51
  • http://www.codeproject.com/Articles/13985/NET-Based-Add-in-Plug-in-Framework-with-Dynamic-T

    學習不是查個 Google 套個書上的範例就算了,而是去熟悉了解每個程式碼背後的意義,否則就算學個幾百年,它也不會是你的。

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

    2013年2月7日 上午 12:57
    版主