是否可以用“弱”引用替換對強名稱程序集的引用?
我正在編寫一個需要 SQL Server SMO 庫的 .NET 工具。我不在乎它是來自 Server 2005 (9.0)、2008 (10.0) 還是 2008 R2(可能是 10.5,沒有檢查)的版本。SMO 庫與 SQL Server 一起安裝,因此我可以放心地假設在任何安裝了 SQL Server 的系統上,也可以使用某些版本的 SMO 庫。
不幸的是,SMO 庫是強命名的:如果我在我的項目中添加對 SMO 9.0 的引用,如果客戶系統上只有 SMO 10.0,它將失敗 (
FileNotFoundException),反之亦然。**有沒有辦法告訴編譯器任何版本的庫都適合我?**還是我真的必須分發 3 個相同版本的工具,每個版本都編譯成不同版本的 SMO?
免責聲明:我知道 SMO 庫(以及 SMO 庫所需的庫)可以重新分發。但是(a)一個纖薄的 100KB 獨立 EXE 和(b)一個安裝了一大堆先決條件的完整安裝包之間存在很大差異。
免責聲明 2:我知道以下重複項:
然而,提供的解決方案並不適用。在問題 1 中,開發人員可以控制引用的 DLL(我沒有);在問題 2 中,開發人員可以控制目標系統(我也沒有)。
據我所知,不可能消除對確切版本的依賴。這就是存在強名稱的原因之一——以避免版本不匹配。程序集的內部結構甚至公共介面都可能在版本之間發生變化,您會發現新版本與舊版本不向後兼容。因此,.NET 會查找編譯期間使用的版本,以確保應用程序正常工作。
如果第三方決定他們的新版本是向後兼容的,並且如果他們將程序集部署到 GAC,他們可以添加將自動重定向的發布者策略。
如果您決定要強制載入另一個程序集,您可以使用@chibacity 提到的方法或為
AppDomain.CurrentDomain.AssemblyResolve. 當 .NET 無法找到引用的程序集時會觸發此事件,您可以實現自己的邏輯來找到它並通過呼叫Assembly.LoadFrom. 在這種情況下,載入哪個版本完全取決於您。