[英]Reproducing Newtonsoft.Json assembly version conflict
我已經着手在Newtonsoft.Json中重復出現匯編版本沖突(與我之前的問題有關為什么Newtonsoft.Json如此容易出現匯編版本沖突? )以便更好地理解它,但我無法觸發它。
從最頂層的答案來看,如果我的項目A引用了一個版本的Json.NET,那么它應該會發生,然后它引用一個項目B,它本身引用了一個不同的版本(並且它們沒有用於處理問題的程序集重定向)。
我已經使用類庫項目和命令行項目制作了一個解決方案,這兩個項目都引用了我用Nuget Package Manager為兩個項目安裝的Newtonsoft.Json,然后我編輯了類庫packages.config以使用舊版本:
<package id="Newtonsoft.Json" version="6.0.1" targetFramework="net452" />
命令行項目引用最新版本:
<package id="Newtonsoft.Json" version="10.0.2" targetFramework="net452" />
這不會觸發問題,但是,項目仍然成功構建並執行(我只是序列化一個字符串並從兩個項目中打印它,我從EXE調用DLL以確保它嘗試加載兩個版本的Newtonsoft.Json。
如果需要,我已經在https://github.com/sashoalm/ReproduceNewtonsoftJsonBug上傳了測試項目。
為什么不會觸發錯誤?
首先,盡管packages.json
文件說的是 - 您的控制台應用程序引用的是版本6,而不是10:
<Reference Include="Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.6.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
但是,如果你修復它(例如通過卸載並重新安裝包) - 它仍然可以正常工作。 那是因為在這種情況下有自動綁定重定向,請參見此處 :
從Visual Studio 2013開始,面向.NET Framework 4.5.1的新桌面應用程序使用自動綁定重定向。 這意味着如果兩個組件引用同一個強名稱程序集的不同版本,則運行時會自動在輸出應用程序配置(app.config)文件中將綁定重定向添加到程序集的較新版本。
如果查看輸出ConsoleApp5.exe.config
文件( 不是 Visual Studio中的app.config但是在Debug \\ Release文件夾中) - 您會注意到綁定重定向在那里自動添加:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
如果刪除它們然后運行目標exe - 它將在運行時失敗。
自動綁定重定向由.csproj文件中的屬性控制。 如果您打開控制台應用程序.csproj,您將在其中一個PropertyGroup
看到:
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
如果將true
更改為false
- 您將禁用此功能,並將看到您嘗試重現的警告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.