程序集A包含對程序集B的引用。程序集A子類 - Class1 - 程序集B中。程序集C還包含相同的基類 - Class1。不同的實現和可能不同的虛擬方法被重寫爲Class1也是子類。一分鐘讓我們假設我很生氣,想在運行時換掉基類實現,替換組件A中引用的內容。在運行時重新定義基類
我調查了assembly redirection,因爲程序集B已簽名且程序集C未簽名,因此失敗。
我無法反編譯代碼併合並程序集,因爲有太多問題需要解決,例如而不是,所有類的定義都很容易被發現。由於需要子類,我不能使用CSharpCodeProvider類,因此需要反編譯。 Reflection.Emit太複雜了,我需要反編譯。
一個選項是獲取子類的副本並根據某個開關執行動態編譯,在代碼中添加任意引用並將結果輸入爲動態。然後子類生活在一個動態的對象中,但是由於與另一個系統的交互,我有這種可怕的感覺,它需要在編譯時或至少在更早的時候纔可用。該代碼由另一個系統調用,該系統可能在啓動時使用Assembly.Load加載重寫的程序集或其他任意點。
使用Assembly.Load動態加載程序集引發了各種問題,你甚至可以用這種方式使用反射來代替基類嗎?
有沒有人知道一個可行的解決方案?
編輯: 更多的上下文 - 問題是我們有一些虛擬方法的覆蓋,將其推廣到數千個盒子。幾百個盒子需要基類的不同實現,目前需要進行2次部署才能應用各種腳本來解決這個問題。其目標是爲所有部署提供二進制相同的dll,最好找到一種使用config在需要時切換實現的方式,而不是在數千次安裝中更改dll,這需要軟件重新啓動,可能會中斷業務和創建支持問題。之前已經犯了一個錯誤,我無法改變單片架構。
而不是說:「這是我爲了解決我的實際問題而瘋狂的想法」,而是告訴我們更多關於真實問題本身的信息。動態交換基類感覺就像是一個令人討厭的解決方案,即使你可以讓它工作,它也可能非常脆弱。那麼,你真的想做什麼? – 2014-10-03 16:37:22
*爲什麼*你需要不同的基類嗎?這是一個非常奇怪的要求 - 事實上,我不記得以前需要什麼。例如,這可以通過組合而不是繼承來處理嗎? (這通常是我的第一種方法,如果繼承造成困難......) – 2014-10-03 16:46:06
+1組成。作文真的是你的朋友。 – 2014-10-03 16:49:40