我什麼時候必須使用綁定重定向?
項目 A 使用
log4net 1.2.13.0,並且依賴於使用log4net 1.2.11.0. 如果我這樣做Package Manager Console> Add-BindingRedirect了,我會得到一個正確的綁定重定向app.config:<dependentAssembly> <assemblyIdentity name="log4net" publicKeyToken="669e0ddf0bb1aa2a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.2.13.0" newVersion="1.2.13.0" /> </dependentAssembly>我認為這是完成建構所必需的。但是在沒有重定向的情況下建構也會成功。這是我在建構日誌中看到的內容(詳細程度設置為詳細):
統一主要參考“log4net,版本=1.2.13.0,文化=中性,PublicKeyToken=669e0ddf0bb1aa2a”。在“C:\Users\vorou\code\ConsoleApplication1\packages\LibraryB.dll”中使用此版本而不是原始版本“1.2.11.0”,因為 AutoUnify 為“真”。
AutoUnify 到底是什麼?哪個更好,即在 .config 中進行顯式重定向有什麼好處?
另外,我記得,在某些情況下,您需要添加綁定重定向。否則應用程序將在執行時崩潰。這些情況是什麼,為什麼這種
AutoUnify魔法對他們不起作用?UPD以下是MSDN的摘錄
AutoUnify:此參數用於建構程序集,例如 DLL,它們不能有普通的 App.Config 文件。當為 true 時,生成的依賴關係圖會自動被視為有一個 App.Config 文件傳遞給 AppConfigFile 參數。此虛擬 App.Config 文件對於每個衝突的程序集集都有一個 bindingRedirect 條目,以便選擇最高版本的程序集。這樣做的結果是永遠不會有關於衝突程序集的警告,因為每個衝突都將得到解決。
看起來 .config 中的重定向在我的情況下沒有任何作用。問題是庫 B 不能滿足它的依賴關係,並
AutoUnify使用“假裝存在綁定重定向”規則來解決它。
版本控制是一個很大的話題,不能在單個 SO 文章中做到公正。所以速度極快:
當您使用多個 Nuget 包並且它們具有共同的依賴關係時,這些惡作劇是必要的。像 log4net 或 NewtonSoft.Json 一樣,非常常見的庫沒有將程序集放入 GAC 的安裝程序。
問題是,每個 Nuget 包很可能使用這些核心支持庫的不同版本建構。而且這樣的包不太可能獲得足夠的更新來保持最新版本,包作者更喜歡他測試程式碼的版本。因此,您將很容易在建構目錄中得到一個要求 1.2.11.0 的程序集和另一個要求 1.2.13.0 的程序集
那是行不通的。CLR 在載入程序集時堅持*精確的版本匹配。*並且必須從您的建構目錄中載入它,並且不能依賴 GAC 來提供它們。DLL 只能有一份副本,不可避免地,其中一個包庫會得到錯誤的版本,您的程序會崩潰。不好,如果沒有重建 Nuget 包,您有一個無法解決的問題。
這就是綁定重定向解決的問題。它只在執行時產生影響,而不是在建構時產生影響。它告訴 CLR,“如果它要求 1.2.11.0,那麼只需載入 1.2.13.0。或者更一般地說,使用這個特定的綁定重定向:“如果它要求任何版本小於 1.2.13.0”。問題解決了,不再崩潰.手指交叉,該軟體包仍然適用於該較新版本。當只有修訂號不同時,它們通常會這樣做。但沒有硬性保證。
另一件需要決定的事情,這發生在建構時,是應該選擇哪個特定版本的庫。你想要 1.2.11.0 還是 1.2.13.0?這就是 AutoUnify 所做的。沒什麼很複雜的,它選擇了更高的版本。