2009-06-10 56 views
0

我有一個動態加載dll的應用程序。應用程序和 dll使用Functions.dll,它可以是針對每個dll的應用程序的不同版本 ,但在執行時應用程序和dll都使用相同的 dll版本(由EXE使用的版本)和共享靜態變量...C#動態DLL系統問題

我如何強制他們使用自己的Functions.dll(n版本)?

-details:

  • 我試圖通過裝載DLL的 「裝配 DLL = Assembly.LoadFile(」 和由 「集DLL = domaindll.Load(」
  • 在Functions.dll,人這些方法和對象是靜態
  • 我用Functions.dll「靜態」的引用它在所有 情況throught VS不是動態
  • 的DLL和Functions.dll在C#開發過

- 文件夾Estructure:

應用:

Application.EXE 
Functions.dll(version 1.2) 
DLLS: 
    EXAMPLEDLL1: 
     EXAMPLEDLL1.DLL 
     Functions.dll(version 1.1) 
    EXAMPLEDLL2: 
     EXAMPLEDLL2.DLL 
     Functions.dll(version 1.0) 
    EXAMPLEDLL3: 
     EXAMPLEDLL3.DLL 
     Functions.dll(version 1.2) 

回答

4

您可以通過強在簽約強制綁定到一個DLL的特定版本。您也可以嘗試在參考屬性上將「特定版本」設置爲true,但據我所知只會影響編譯時綁定,並且如果程序集沒有強簽名,則可以在運行時加載不同的版本。

這應該讓你開始:Strong-Name Signing for Managed Applications

要知道,雖然,在此DLL中聲明的任何類型的不會是類型等同於一個不同版本的程序集相同的類型。例如,如果我在Functions.dll中聲明名爲Foo的類,則版本1.0中的Foo實例將不會與版本1.1中的Foo實例具有相同類型。就CLR而言,這些是完全不同的類型。

如果你所有的都是程序集中的靜態函數,並且沒有定義類型,那麼你應該沒問題。否則,你需要研究一種不同的方法。

+0

它是一個很好的解決方案...但我不能簽署Functions.dll,因爲當我在一個測試中使用簽名的Fuctions.dll(靜態引用它到一個項目)時,它會給出每個dll方法中的隨機錯誤。 (這不會發生在未簽名的) 例子: 最好的重載方法匹配-'Funciones.FunSAP。comboboxvaciar(SAPbouiCOM.ComboBox)'有一些無效參數 -'x.Application'不包含'Formx'的定義,也沒有找到接受'x.Application'類型的第一個參數的擴展方法'Formx'(你是否缺少使用指令或程序集引用?) – VSP 2009-06-11 07:49:34

+0

也許你應該編輯你的問題併發佈一個實際的代碼示例。這可能會使問題更加明顯。 – 2009-06-11 13:02:44

0

爲了做到這一點,我認爲你必須將你的(例子)DLL加載到單獨的AppDomain中。進行跨AppDomain調用會帶來一些性能損失,但在您突出顯示的情況下,這是不可避免的。

0

最後,我解決了它重命名Functions.dll以匹配EXAMPLEDLL使用它....例如:Application.EXE - > FunctionsApplication.dll EXAMPLEDLL1.dll - >函數EXAMPLEDLL1.dll感謝您的答案無論如何..

Postdata:在另一種情況下,我可以正確簽署dll我認爲亞當羅賓遜的答案是正確的(和第二個anwser jerryjvl)。