无法加载文件或程序集“Newtonsoft.Json,Version=10.0.0.0”

3
我不明白我面临的以下问题。 我有三个项目,A,B和C。它们都引用Newtonsoft.Json版本12.0.1。项目a引用了B和C两个项目。 项目B引用了Microsoft.IdentityModel.Tokens.Jwt。当我运行项目A并尝试执行必要的函数创建令牌时,我会得到以下运行时错误:
消息:
"The type initializer for 'System.IdentityModel.Tokens.Jwt.JsonExtensions' threw an exception."
内部异常:
"Could not load file or assembly 'Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified."
我已经验证所有项目都引用相同的Newtonsoft.Json包,版本为12.0.1。 我还检查了我的项目文件以确保没有引用Newtonsoft.Json版本10.0.0.0。 我漏掉了什么?

你尝试过为整个解决方案合并NuGet包吗? - Dr. Roggia
这是一个Web项目还是Windows应用程序?请查看_web.config_或_app.config_,如果有任何条目包含Newtonsoft.Json和错误的版本号。 - schlonzo
2
你可能需要添加一个 程序集重定向 - Liam
@Liam,请看一下这个。 - monstertjie_za
如果您正在使用packages.config进行NuGet引用,迁移到PackageReference可能会解决问题,因为PackageReference支持传递依赖项(packages.config不支持),并且通常可以根据需要自动生成绑定重定向。 - zivkan
显示剩余3条评论
5个回答

1

1

Newtonsoft Json虽然有用,但也是许多问题的根源。

您需要检查解决方案中每个项目引用的所有NuGet包,以查看它们需要哪个版本的Newtonsoft Json。有些指定了最小版本,在这种情况下,您不会遇到问题(例如> 10,任何高于10的版本都可以使用),而其他一些则需要特定的固定版本(= 10,必须是10,不能更低或更高)。这取决于特定NuGet包的作者。

当您构建时,所需的由引用包引用的dll将被复制,然后将复制任何引用项目所需的dll,可能会复制某个版本,当您运行应用程序时,您会看到您所见过的错误。

您可以通过查看构建配置文件夹中的bin文件夹,右键单击dll文件并检查其版本来检查此问题。程序集重定向应该有所帮助,但在正确位置完成,但有一种替代方案,尽管不总是可行。

如果您可以将Newtonsoft Json降至满足所有要求的最低版本,那么这是解决问题的好方法。根据您从中使用的内容以及其他软件包的要求,您可能不需要版本12。您可能能够更改所有项目以引用较低的版本而不会产生任何副作用。如果可以,请确保不要错误升级。如果不能,则必须执行版本重定向,如其他答案所示。
基本思路是确保在解决方案中只使用一个版本的Newtonsoft。您可以在解决方案级别检查此软件包,还有一个合并选项。
因此,请检查解决方案中的所有项目,确保它们都使用Newtonsoft的一个版本,并且该版本在所有项目中都相同。
一旦您成功将所有内容整合到一个级别,请确保:
  1. 您删除Windows / Microsoft.Net,Framework23或64(取决于您使用哪个)中的Temporary ASp.Net文件夹内容。
  2. 从所有bin文件夹中删除所有dll,简单的清理可能不足以完成。
完成所有这些操作后,只要您在所有地方都有一个版本,就应该能够无问题地运行项目。

感谢您的回答。我已经在所有项目中降级了所有Newtonsoft.Json包,但似乎仍然遇到了相同的问题,我不确定原因是什么,因为我已经确认过了。 - monstertjie_za
我在我的回答中添加了一些东西,应该可以帮助你使一切正常运作。 - Andrei Dragotoniu

1
我认为你的一些项目正在引用newtonsoft.json.dll的版本10,而另一些项目正在引用版本12。
似乎v12 DLL被复制到输出目录中。引用v10版本的项目会抛出此错误。
对于所有强名称程序集,特定版本的DLL将在应用程序目录或GAC中搜索。您可以通过使用以下配置文件条目覆盖此默认行为 - 它指示.NET Framework始终在调用0到12中的任何版本时查找v12。
<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.1.0" newVersion="12.0.1.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

希望这可以解决您的问题。

我需要在抛出错误的项目中修改这个程序集绑定吗? - monstertjie_za
出现错误的项目有以下绑定重定向: <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" /> - monstertjie_za
它是一个应用程序(即.EXE)还是一个DLL?请将此绑定重定向添加到应用程序(exe的)配置文件中。 - Manoj Choudhari
抛出错误的项目是一个NuGet包(DLL)。 - monstertjie_za
根据您的问题,您正在运行项目"A"。这意味着您将不得不在项目"A"的配置文件中放置此绑定重定向。 - Manoj Choudhari
我点了个赞。如果我不是在创建Azure函数应用程序,你的答案可能有效。但是我还需要做一些额外的工作,你可以在我的回答中看到。 - monstertjie_za

0

找出试图加载此库的项目。右键单击项目->管理Nuget程序包->在已安装的库中查找NewtonJson库并单击卸载,也许这会有所帮助。另外,像之前提供的建议一样,使用程序集重定向。


-1

如果你正在使用 Microsoft.IdentityModel.Tokens.Jwt,不要将其添加为页面的 using,而是直接引用它。


我会尝试一下。你能解释一下为什么你认为这个方法可以解决问题吗? - monstertjie_za
听起来像是在B类中使用Microsoft.IdentityModel.Tokens.Jwt的任何东西都试图使用Newtonsoft.Json版本10.0.0.0,但被A类和C类引用的Newtonsoft.Json版本12.0.0.0让它感到困惑。我可能误解了,但我以前遇到过类似的情况。我也通过卸载和重新安装软件包来修复这个问题。 - James Blackburn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接