我有一個引用第三方庫的項目。圖書館的製造商定期發佈新版本。我的最終目標是能夠在運行時選擇在執行期間必須使用哪個版本。在運行時交換強烈簽名的程序集
現在,我試圖在運行時加載一個程序集,其版本號比編譯期間使用的版本號高。我編譯我的項目,用新版本替換第三方庫並嘗試運行應用程序。這是我遇到問題。我得到一個錯誤說:
「找到的程序集清單定義不匹配的程序集引用」
我是不是supprised看到這個錯誤,因爲大會強烈簽名。我尋找方法繞過這一點,但迄今沒有任何運氣。
我認爲綁定重定向可以幫助我,但它的缺點是你不能指定一系列「newversions」。任何組合都應該可以工作,使用較新版本的舊版本,反之亦然。
<bindingRedirect oldVersion="1.2.7.0" newVersion="1.2.8.0" />
http://msdn.microsoft.com/en-us/library/eftw1fys.aspx
我也看了看動態調用,但後來我失去的類型安全(我的代碼廣泛使用在屆黨集中定義的類型)。 - >刪除參考很困難。
刪除項目定義引用中的公鑰也沒有幫助。編譯期間使用的任何其他程序集版本都會失敗。
<Reference Include="<assemblyname>">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Dependencies\<manufacturer>\1.2.7.0\<assemblyname>.dll</HintPath>
</Reference>
注: 邏輯來加載和卸載在運行時已經存在的組件。 沒有可用於第三方庫的接口
Brr,這是要求DLL地獄作爲一項功能。它與強命名沒有任何關係,因爲[AssemblyVersion]中的不匹配而引發異常。 bindingRedirect確實是唯一很好的解決方案。除非您能說服供應商只增加兼容程序集的[AssemblyFileVersion],否則您會被卡住。否則增加[AssemblyVersion]意味着「不兼容,甚至不嘗試」。 – 2012-01-02 15:52:26
@HansPassant AssemblyVersion確實是遞增的,導致清單不匹配。說明明顯不匹配只能出現在強簽名的程序集中才正確嗎?還是這個問題也適用於未簽名的程序集? [程序集版本控制](http://msdn.microsoft.com/zh-cn/library/51ket42z.aspx) – Nickolas 2012-01-02 19:15:44
不,只有[AssemblyVersion]在這裏很重要。它將以完全相同的方式在未簽名的程序集上失敗。 – 2012-01-02 19:20:32