![](/img/trans.png)
[英]Could not load file or assembly Newtonsoft.json Version 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 鏈接:
關閉項目,然后再次安裝包:Install-Package Newtonsoft.Json -12.0.0
此外,如果您有指向它的鏈接,請檢查任何其他項目中的 Newtonsoft.Json 版本。
另一種選擇是讓 Visual Studio 重建(正確)綁定重定向。 以下是步驟:
assemblyBinding
部分中的所有內容: <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> *** remove all of the <dependentAssembly> stuff *** </assemblyBinding> </runtime>
此命令將重建項目中任何必要的綁定重定向。 您可以重建、運行或部署,現在情況應該會更好。
除了其他答案......有時你只需要一根大棒。 尤其是“舊”風格的 csproj。 較新的PackageReference
樣式不太容易出現這種情況。
有時 VS/msbuild 可能會在 sln 之前使用以前的版本構建時“混淆”(舊版本的文件不會被覆蓋)。
ls -include obj,bin -recurse | rm - force -recurse
只需刪除所有 obj 和 bin 文件夾。 這多次挽救了我的理智
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.