簡體   English   中英

在運行時加載2個版本的程序集

[英]Loading 2 versions of assembly at runtime

在過去的幾周里,我一直試圖破解這個,但還沒有找到一個好的解決方案; 希望我能在這里得到答案。

我有兩個程序集(ZA和ZB),它們都指向一個公共項目/ dll(ZC)但可能在不同的版本上(即相同的dll名稱,相同的名稱空間,某些類可能不同)。 然而,如果一個程序集在運行時由另一個程序集加載(例如A加載B),那么每個程序集都可以自行工作,那么我就無法使它工作。 需要一些幫助。

這是設置:

  • ZA依賴於ZC(通用)版本1.1
  • ZB依賴於ZC 1.0版

ZA需要在運行時加載需要在ZB(依賴於ZC)中加載某些東西。

ZA是主應用程序。 在它的bin目錄下,有一個插件目錄plugins/plugin-ZB ,我希望在其下放置所有ZB及其依賴項(ZC)。

這是我到目前為止所嘗試的:

Assembly.Load()使用相同版本的dll - 工作正常。

Assembly.Load()使用不同版本的dll - ZB加載,但是當方法運行時,我得到一個找不到異常的方法。

AppDomain.Load()找不到文件錯誤; 我甚至使用委托來解決程序集。

關於ZC的一些細節: - 一些方法是公共靜態(有些方法不是)。 例如Log.Log("hello"); - 有些人可能會返回值(基元或對象)。 - 某些方法是非靜態的(和返回值)。

救命? - TIA

    m_Assembly1 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "Old Version\Some.dll"))
    m_Assembly2 = Reflection.Assembly.LoadFile(IO.Path.Combine(System.Environment.CurrentDirectory, "New Version\Some.dll"))

    Console.WriteLine("Old Version: " & m_Assembly1.GetName.Version.ToString)
    Console.WriteLine("New Version: " & m_Assembly2.GetName.Version.ToString)

    m_OldObject = m_Assembly1.CreateInstance("FullClassName")
    m_NewObject = m_Assembly2.CreateInstance("FullClassName")

從現在開始,我使用后期綁定和/或反射來運行我的測試。

.NET:加載同一DLL的兩個版本

除了Jonathan Allen的優秀建議之外,解決問題的更“經典”方法是在2個不同的AppDomanis中加載2個版本。 然后,您可以使用.NET Remoting使兩個AppDomains通信。 所以ZA應該在這個AppDomain ZB中創建一個新的Appdomain,Load並通過Remoting在ZB中調用一些操作。

請注意,.NET Remoting對您要使用的類有一些要求(從MarshalByRef繼承),而創建AppDomain是一項昂貴的操作。

希望這有幫助

我同時加載了同一個程序集的兩個版本。 就像你描述的那樣,它發生在一個場景中。

您必須說服運行時為ZA和ZB加載相同版本的ZC。 我找到了兩種方法:

  1. 在App.config文件中使用bindingRedirect元素。 這個問題有一些細節。
  2. 使用AppDomain.AssemblyResolve事件。 這個答案中有一些細節。

AppDomain.AssemblyResolve的唯一問題是它只在運行時找不到請求的版本時觸發。 如果兩個版本都可用,那么您將必須使用bindingRedirect 我已經使用了AppDomain.AssemblyResolve事件,然后添加了一個安全檢查,通過查看程序集的引用程序集集來確保加載了正確的版本。 如果不是,我向用戶抱怨該庫的舊版本就在它周圍並告訴它們它在哪里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM