[英]Loading 2 versions of assembly at runtime
在過去的幾周里,我一直試圖破解這個,但還沒有找到一個好的解決方案; 希望我能在這里得到答案。
我有兩個程序集(ZA和ZB),它們都指向一個公共項目/ dll(ZC)但可能在不同的版本上(即相同的dll名稱,相同的名稱空間,某些類可能不同)。 然而,如果一個程序集在運行時由另一個程序集加載(例如A加載B),那么每個程序集都可以自行工作,那么我就無法使它工作。 需要一些幫助。
這是設置:
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")
從現在開始,我使用后期綁定和/或反射來運行我的測試。
除了Jonathan Allen的優秀建議之外,解決問題的更“經典”方法是在2個不同的AppDomanis中加載2個版本。 然后,您可以使用.NET Remoting使兩個AppDomains通信。 所以ZA應該在這個AppDomain ZB中創建一個新的Appdomain,Load並通過Remoting在ZB中調用一些操作。
請注意,.NET Remoting對您要使用的類有一些要求(從MarshalByRef繼承),而創建AppDomain是一項昂貴的操作。
希望這有幫助
我同時加載了同一個程序集的兩個版本。 就像你描述的那樣,它發生在一個場景中。
您必須說服運行時為ZA和ZB加載相同版本的ZC。 我找到了兩種方法:
AppDomain.AssemblyResolve
的唯一問題是它只在運行時找不到請求的版本時觸發。 如果兩個版本都可用,那么您將必須使用bindingRedirect
。 我已經使用了AppDomain.AssemblyResolve
事件,然后添加了一個安全檢查,通過查看程序集的引用程序集集來確保加載了正確的版本。 如果不是,我向用戶抱怨該庫的舊版本就在它周圍並告訴它們它在哪里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.