簡體   English   中英

再現Newtonsoft.Json程序集版本沖突

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM