Newtonsoft.Json 依赖项未在“dotnetpublish-o<其他文件夹>”上以正确的版本发布

Nat*_*G-T 5 c# dll dependencies build production-environment

问题

\n

所以基本上,我正处于 DLL 地狱中。

\n

我有一个 dotnet 5.0 + React 项目,其中 C# 依赖项(我假设Microsoft.AspNetCore.Mvc.NewtonsoftJson)需要另一个依赖项Newtonsoft.Json

\n

在 bin 文件夹中以发布或调试方式构建和发布时,项目运行得非常好,并且所有依赖项和 .dll 均已正确加载。但一旦我使用该-o选项dotnet publish在发布的文件夹中创建的 Newtonsoft.Json.dll 的版本就是 9.0.0.0,这会在尝试在生产中运行服务器时引发错误,因为它预计它的版本是 12 .xxx

\n

我尝试过的

\n

目前我有一个修复程序,即独立构建 Newtsoft.Json dll 文件的正确版本(12.xxx 或更高版本),并在投入生产时将其放入已发布的文件夹中,但显然我想知道其他可能的修复或更直接的修复,而无需在生产中部署时执行额外的步骤,并帮助将来因此依赖项或其他依赖项而面临相同问题的人们。

\n
    \n
  • 我尝试在 .csproj 中明确包含正确版本的依赖项,但依赖项仍然在版本 9.0.0.0 中输出。
  • \n
  • 另一个修复方法是将 Microsoft.AspNetCore.Mvc.NewtonsoftJson 降级到接受 9.0.0.0 的版本,但这会带来一大堆蠕虫病毒
  • \n
  • 我尝试过清除我的 nuget 包,但这也不起作用。
  • \n
  • 我已经尝试过这个最近的堆栈溢出解决方案,OP 面临类似的问题,但他们将 False 添加到测试项目的修复对我不起作用,因为我的测试项目不使用 Newtonsoft.Json。
  • \n
\n

文件

\n
    \n
  • .csproj 中列出的依赖项
  • \n
\n
  <ItemGroup>\n    <PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="5.0.11" />\n    <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.10" />\n    <PackageReference Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="5.0.6" />\n    <PackageReference Include="Microsoft.AspNetCore.ApiAuthorization.IdentityServer" Version="5.0.6" />\n    <PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="5.0.6" />\n    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.6" />\n    <PackageReference Include="Microsoft.AspNetCore.Identity.UI" Version="5.0.6" />\n    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.6" />\n    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.6" />\n    <PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="5.0.6" />\n    <PackageReference Include="Newtonsoft.Json" Version="13.0.1" />\n    <PackageReference Include="Newtonsoft.Json.Bson" Version="1.0.2" />\n    <PackageReference Include="System.Data.SqlClient" Version="4.8.3" />\n  </ItemGroup>\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 输出Newtonsoft.Json.dll
  • \n
\n
// C:\\Users\\***\\published\\Newtonsoft.Json.dll\n// Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed\n// Global type: <Module>\n// Architecture: AnyCPU (64-bit preferred)\n// Runtime: v4.0.30319\n// This assembly is signed with a strong name key.\n// Hash algorithm: SHA1\n// Public key: 0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7\n\nusing System;\nusing System.Diagnostics;\nusing System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.Versioning;\n\n[assembly: CompilationRelaxations(8)]\n[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]\n[assembly: Debuggable(/*Could not decode attribute arguments.*/)]\n[assembly: AssemblyInformationalVersion("9.0.1")]\n[assembly: NeutralResourcesLanguage("en-US")]\n[assembly: TargetFramework(".NETStandard,Version=v1.0")]\n[assembly: AssemblyTitle("Json.NET .NET Standard 1.0")]\n[assembly: InternalsVisibleTo("Newtonsoft.Json.Schema, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")]\n[assembly: InternalsVisibleTo("Newtonsoft.Json.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f561df277c6c0b497d629032b410cdcf286e537c054724f7ffa0164345f62b3e642029d7a80cc351918955328c4adc8a048823ef90b0cf38ea7db0d729caf2b633c3babe08b0310198c1081995c19029bc675193744eab9d7345b8a67258ec17d112cebdbbb2a281487dceeafb9d83aa930f32103fbe1d2911425bc5744002c7")]\n[assembly: InternalsVisibleTo("Newtonsoft.Json.Dynamic, PublicKey=0024000004800000940000000602000000240000525341310004000001000100cbd8d53b9d7de30f1f1278f636ec462cf9c254991291e66ebb157a885638a517887633b898ccbcf0d5c5ff7be85a6abe9e765d0ac7cd33c68dac67e7e64530e8222101109f154ab14a941c490ac155cd1d4fcba0fabb49016b4ef28593b015cab5937da31172f03f67d09edda404b88a60023f062ae71d0b2e4438b74cc11dc9")]\n[assembly: AssemblyDescription("Json.NET is a popular high-performance JSON framework for .NET")]\n[assembly: AssemblyConfiguration("")]\n[assembly: AssemblyCompany("Newtonsoft")]\n[assembly: AssemblyProduct("Json.NET")]\n[assembly: AssemblyCopyright("Copyright \xc2\xa9 James Newton-King 2008")]\n[assembly: AssemblyTrademark("")]\n[assembly: AssemblyFileVersion("9.0.1.19813")]\n[assembly: CLSCompliant(true)]\n[assembly: AssemblyVersion("9.0.0.0")]\n
Run Code Online (Sandbox Code Playgroud)\n

ggr*_*nig 4

希望我能解释为什么会发生,但实际上我不明白。一条线索是检查您的project.assets.json文件/obj夹,其依赖项实际上需要版本 9 中的 Newtonsoft(对确切的版本号进行全文搜索)。

然后,如果您已经识别了该软件包(在我们的例子中是)Microsoft.Extensions.DependencyModel,您可以升级该软件包,以便它使用更新的 Newtonsoft 版本。在我们的例子中,我们在升级版本中明确添加了这个包。或者,将“PrivateAssets=true”设置为依赖项似乎也有效。

如果有一些包的版本为 9,而另一些包的版本为其他包,我们实际上注意到该行为不是确定性的,因此发布的 DLL 有时是版本 9,有时是版本 13。