簡體   English   中英

運行時無法加載文件或程序集“Newtonsoft.Json,版本=6.0.0.0 ...”,間接依賴程序集繼續尋找舊版本

[英]Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0 ..." during runtime ,indirect dependency assembly keep looking for old version

我有一個 C# 項目,它直接引用了 Newtonsoft.Json 和一些其他引用(間接引用了 Newtonsoft.Json)。 我想在所有地方將 Newtonsoft.Json 版本從 6.0.8 升級到最新的 12.0.2。

最初我得到了無法解決參考程序集的問題,但在搜索后我嘗試將綁定放入 app.config 並且現在可以成功構建解決方案:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

我的項目如下所示:

<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
      <HintPath>..\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
      <SpecificVersion>False</SpecificVersion>
      <Private>True</Private>
    </Reference>

現在問題變成了在運行時調用庫時,它會引發以下錯誤:

mymethod 拋出異常,將重試:無法加載文件或程序集 'Newtonsoft.Json,Version=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed' 或其依賴項之一。 該系統找不到指定的文件。”

使用AsmSpy ,似乎間接引用是根本原因:

參考:Newtonsoft.Json,版本=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed Newtonsoft.Json,版本=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed 來源:Microsoft.Azure.KeyVault 的 NotFound 6.0.0.0,版本=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 6.0.0.0 by Microsoft.Azure.KeyVault.WebKey, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 6.0.0.0 by Microsoft.Rest.ClientRuntime, Version=2.0 .0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 6.0.0.0 by Microsoft.Rest.ClientRuntime.Azure, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

通過啟用診斷項目輸出,構建時似乎很好:

2>  Unified primary reference "Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed". (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Azure.KeyVault.2.0.6\lib\net45\Microsoft.Azure.KeyVault.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Azure.KeyVault.WebKey.2.0.4\lib\net45\Microsoft.Azure.KeyVault.WebKey.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Rest.ClientRuntime.2.3.2\lib\net45\Microsoft.Rest.ClientRuntime.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Using this version instead of original version "6.0.0.0" in "F:\packages\Microsoft.Rest.ClientRuntime.Azure.3.3.1\lib\net45\Microsoft.Rest.ClientRuntime.Azure.dll" because AutoUnify is 'true'. (TaskId:19)
2>      Resolved file path is "F:\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.dll". (TaskId:19)
2>      Reference found at search path location "{HintPathFromItem}". (TaskId:19)
2>      Found related file "F:\packages\Newtonsoft.Json.12.0.2\lib\net45\Newtonsoft.Json.xml". (TaskId:19)
2>      The ImageRuntimeVersion for this reference is "v4.0.30319". (TaskId:19)

然后我嘗試將所有這 4 個 nuget 包升級到最新版本,並在我的解決方案中重新安裝包,清理解決方案並重建,再試一次但仍然失敗。

有沒有人遇到過同樣的問題以及如何解決這個問題?

只需從所有地方刪除任何 Newtonsoft.Json 鏈接:

  • *.csproj
  • 包.config
  • 包文件夾
  • 文件夾
  • 你能找到的任何其他地方

關閉項目,然后再次安裝包:Install-Package Newtonsoft.Json -12.0.0

此外,如果您有指向它的鏈接,請檢查任何其他項目中的 Newtonsoft.Json 版本。

另一種選擇是讓 Visual Studio 重建(正確)綁定重定向。 以下是步驟:

  1. 做一個備份(簽到,shelfset,zip等)
  2. 打開您的 web.config 並刪除所有當前綁定重定向。 這幾乎是assemblyBinding部分中的所有內容:

<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> *** remove all of the <dependentAssembly> stuff *** </assemblyBinding> </runtime>

  1. 在 Visual Studio 中打開包管理器控制台。 菜單:查看 -> 其他窗口 -> 包管理器控制台菜單
  2. 運行此命令:Get-Project -All | 添加綁定重定向

此命令將重建項目中任何必要的綁定重定向。 您可以重建、運行或部署,現在情況應該會更好。

除了其他答案......有時你只需要一根大棒。 尤其是“舊”風格的 csproj。 較新的PackageReference樣式不太容易出現這種情況。

有時 VS/msbuild 可能會在 sln 之前使用以前的版本構建時“混淆”(舊版本的文件不會被覆蓋)。

  • 關閉 VS
  • 在 powershell 中,在 sln 的根文件夾中
  • ls -include obj,bin -recurse | rm - force -recurse

只需刪除所有 obj 和 bin 文件夾。 這多次挽救了我的理智

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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