我收到了错误
System.IO.FileLoadException:无法加载文件或程序集 ' Newtonsoft.Json,Version = 4.5.0.0,Culture = neutral, 公钥= 30ad4fe6b2a6aeed'或其中一个依赖项。该 定位程序集的清单定义与程序集不匹配 参考。 (HRESULT异常:0x80131040)
我的CI构建
我试过的解决方案
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
它也不起作用
答案 0 :(得分:222)
在包管理器控制台中执行:Update-Package –reinstall Newtonsoft.Json
。
<强>更新强>
我最初将此作为评论发布,但正如@OwenBlacker建议我将其放在此处:
如果在执行此操作后仍然出现错误,那么最终对我有用的是我从<dependentAssembly>
文件中删除了Json.Net的.config
部分。如果不存在,重新安装会将其恢复,显然您需要将其删除。直到包装本身有一个正常的解决方案,我担心这个手动步骤是必须的。
注意:请在执行此操作之前阅读以下注释。
根据René在 BE AWARE 下面的评论,答案中发布的命令将在您的解决方案中的每个项目中重新安装软件包。因此,如果您在多个项目中使用Newtonsoft.Json包并且可能使用不同的版本,则执行上述命令可能会产生不良后果。
答案 1 :(得分:116)
对于遇到Newtonsoft.Json v4.5版本问题的每个人,请尝试在web.config或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-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
重要:检查配置文件的configuration
标记是否没有命名空间属性(如https://stackoverflow.com/a/12011221/150370中所述)。否则,assemblyBinding
标记将被忽略。
答案 2 :(得分:39)
关键点是在配置文件中引用正确的版本。
<强>步骤; 强>
1-查看项目引用属性中Newtonsoft.Json.dll的版本是什么版本包文件夹中的版本(例如我的版本是7.0.1,参考版本是7.0.0.0)
2-看看项目在异常中对你的期望(我的是6.0.0.0)
3-将依赖程序集添加到配置文件中,因为它应该是..
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
答案 3 :(得分:24)
我对这里提出的任何解决方案都没有运气(卸载,重新安装,删除引用,创建bindingRedirects等)。我不得不回到旧版本的Newtonsoft。版本5.0.6之前一直在工作,所以我尝试了那个。我必须在Package Console中输入这两个命令:
uninstall-package newtonsoft.json -force
install-package newtonsoft.json -version "5.0.6"
第一个命令中的-force
选项是强制卸载所必需的。与其他程序集的依赖关系会阻止没有它的卸载。
答案 4 :(得分:22)
我修复了将此绑定重定向添加到我的.config文件的问题:
<runtime>
. . .
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<bindingRedirect oldVersion="4.5.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
错误消息抱怨没有找到版本4.5.0.0,当前版本的Newtonsoft.Json是6.0.0.0所以重定向应该从4.5到6.0,而不是反之亦然
答案 5 :(得分:20)
我认为你指的是错误的目标,将其改为4.5而不是6.0
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
这应该有用。
答案 6 :(得分:18)
我花了几天时间试图解决这个令人沮丧的问题。我已经尝试了几乎所有可以在网上找到的东西。最后,我发现在一个解决方案中,不同的目标.Net项目版本(4.5和4.5.1)可能会导致此错误(就像我的情况一样)。下面的步骤对我来说是固定的:
Properties
。如果可能,为所有项目设置相同的.Net版本。如果不是至少尝试更改一个启动项目(对我来说这是导致问题的那个)。
从解决方案中删除所有Newtonsoft.Json
包。
uninstall-package newtonsoft.json -force
更新所有Newtonsoft.Json
个文件中的所有packages.config
版本,如此
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net451" />
使用以下命令从“程序包管理器控制台”重新安装Newtonsoft.Json
install-package newtonsoft.json
重建解决方案
(可选)7。如果您更改了启动项目,请再次返回
答案 7 :(得分:11)
uninstall-package newtonsoft.json -force
install-package newtonsoft.json
我的诀窍是:)
答案 8 :(得分:10)
从项目引用中删除Newtonsoft.Json程序集并再次添加。您可能意外删除或替换了DLL。
答案 9 :(得分:9)
如果您在同一解决方案中使用多个项目 和另一个的图书馆 check是所有项目都有相同版本的Newtonsoft.Json
答案 10 :(得分:9)
我正在编写一个WebApi REST服务客户端,所以对我来说,这个错误是由于我应该添加{{1}时通过Add Reference手动添加System.Net.Http
和System.Net.Http.Formatting
程序集的引用而引起的。通过 NuGet 打包。
另请参阅this answer to another question。
答案 11 :(得分:8)
您的解决方案中有2个不同版本的JSON.NET库。要解决此问题,您应该将它们升级到最新版本。请按照以下步骤操作:
1-Open解决方案资源管理器 2 - 右键单击解决方案名称 3 - 选择Manage Nuget Packages for Solution 4 - 从菜单中选择更新 5-Update JSON.NET包
这将解决您的问题。
答案 12 :(得分:7)
将正确的版本部署到CI计算机
这告诉您程序集加载程序找到了Newtonsoft.Json
程序集的不同版本,它与您在项目中创建的引用不匹配。要正确加载程序集,必须将程序集与已编译的代码并排部署,或者在目标计算机中安装正确版本的程序集(即在GAC中)。
替代方法:确保配置位于正确的文件中
如果要保留当前解决方案并加载具有不同版本的程序集,请确保您发布的配置位于正确的.config
文件中。请记住,没有xpto.dll.config
,应用程序加载的DLL总是使用正在运行的应用程序的配置文件。
答案 13 :(得分:6)
通常添加绑定重定向应解决此问题,但它不适合我。几个小时后我的头靠在墙上,我意识到有一个xmlns属性导致我的web.config出现问题。从Web.config中的配置节点中删除xmlns属性后,绑定重定向按预期工作。
答案 14 :(得分:5)
关闭解决方案。
使用文本编辑器打开packages.config
和*.csproj
并删除任何包含Newtonsoft.Json的行
例如:
<Reference Include="Newtonsoft.Json,Version=9.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.9.0.1\lib\net40\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
或者
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net40" />
再次打开解决方案并按Install-Package Newtonsoft.Json
它对我有用。
答案 15 :(得分:5)
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json"
publicKeyToken="30AD4FE6B2A6AEED" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
适用于我......只需将您使用的版本放入newVersion即(newVersion =“7.0.0.0”)
答案 16 :(得分:4)
您应该更新服务器中的web.config文件。 当nuget安装NewtonSoft更新此文件包括此代码
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
答案 17 :(得分:4)
我们遇到了与您提到的完全相同的问题。我们使用nunit通过CI运行测试,我们有nunit运行一个名为tests.nunit的文件,该文件描述了要运行的测试dll灯具列表。
每个测试夹具都有自己的配置文件,但是当通过“tests.nunit”文件运行时,绑定重定向似乎被忽略了。解决方案是将绑定重定向添加到新的配置文件“tests.config”,该文件位于“tests.nunit”文件旁边。
答案 18 :(得分:3)
在我的情况下,主项目仍然引用旧版本的Newtonsoft.Json ,它不再存在于项目中(由黄色感叹号显示)。删除引用解决了问题,不需要bindingRedirect。
答案 19 :(得分:3)
只需查看 Newtonsoft.Json Newtonsoft properties
的版本然后你需要在你的web配置中添加该版本(在我的情况下是8.0.0.0) Web config
答案 20 :(得分:3)
我在版本7.0.0.0中遇到了完全相同的问题,导致我的问题的lib是Microsoft.Rest.ClientRuntime,它以某种方式指的是Newtonsoft.json的错误版本(6.0.0.0),尽管有正确的依赖关系管理in nugget(安装了正确版本的newtonsoft.json(7.0.0.0))。
我通过在配置文件中将上面的重定向从6.0.0.0应用到7.0.0.0(来自Kadir Can)解决了这个问题:
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="7.0.0.0" />
----&GT;几天之后没有改变任何东西它再次出现同样的错误。我安装了6.0.0.0版本,将其更新到7.0.0.0,现在工作正常。
答案 21 :(得分:3)
我遇到了同样的问题。我也解决了它只是做了以下事情: 转到 工具 &gt; NuGet程序包管理器 并选择 程序包管理器控制台 。最后,执行以下两个命令:)
答案 22 :(得分:2)
右键单击您的项目,选择管理Nuget包,在搜索框中键入newtonsoft并安装最新版本。然后运行你的应用程序
答案 23 :(得分:2)
在我的情况下,在下载程序集并添加对项目的引用之后,我通过在添加对项目的引用之前“解锁”DLL来解决这个问题。
使用Windows资源管理器,浏览到DLL位置,右键单击DLL,然后选择“属性”。您会在其中一个选项卡上找到“解锁”按钮,然后您可以添加参考,并且装配将正确加载。
答案 24 :(得分:2)
我错误地为.Net 4.5添加了NewtonSoft .dll文件。
我的主要项目是 4.5,但当我在我的解决方案中添加了一个额外的项目时,它奇怪地将它添加为.Net 2.0项目...当我尝试使用NewtonSoft&#39; s 4.5 dll,我得到了这个&#34; Newtonsoft.Json无法找到&#34;错误。
解决方案(当然)是将这个新项目从.Net 2.0更改为4.5。
答案 25 :(得分:2)
上面的任何内容都没有帮助我,但实际上修正了以下内容:
Get-Project -All |添加-BindingRedirect 强>
答案 26 :(得分:2)
通过nuget重新安装newtonsoft软件包对我没用。 我不得不手动调用JsonConvert.DeserializeObject来绕过这个问题
我改变了
HttpResponseMessage response = await client.GetAsync(url));
response.EnsureSuccessStatusCode();
MyObject data = await response.Content.ReadAsAsync<MyObject>();
对于
HttpResponseMessage response = await client.GetAsync(url));
response.EnsureSuccessStatusCode();
string jsonStr = await response.Content.ReadAsStringAsync();
MyObject data = JsonConvert.DeserializeObject<MyObject>(jsonStr);
答案 27 :(得分:2)
如果错误在本地消失并仍然出现在服务器上,那么与我合作的解决方案是删除bin文件夹和packages.config以及web.config并重新上载这些文件
答案 28 :(得分:2)
以下部分添加到您的web.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-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
答案 29 :(得分:2)
另一个隐蔽的问题是,如果元素在任何其他dependentAssembly元素上的配置不正确,那么绑定重定向似乎会无声地失败。
确保每个元素下只有一个元素。
在某些情况下,VS会生成:
<dependentAssembly>
<assemblyIdentity ...
<assemblyIdentity ...
</dependentAssembly>
而不是
<dependentAssembly>
<assemblyIdentity ...
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity ...
</dependentAssembly>
花了很长时间才意识到这就是问题!
答案 30 :(得分:2)
我遇到了同样的错误并且花了几个小时挣扎。我有一个Web API项目,它使用Newtonsoft.json和另一个用于Web API项目的UnitTest项目。单元测试项目还需要Newtonsoft.json参考。但是在添加链接时我得到了上述异常。
我最后通过在单元测试项目的app.config中添加以下代码片段来解决它:
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30AD4FE6B2A6AEED" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
答案 31 :(得分:1)
此外,在具有NuGet还原的CI环境中,请确保没有将部分文件夹签入源代码管理中。默认情况下,将文件夹添加到源代码管理时,它将自动排除程序集。此外,这打破了在构建时恢复nuget包的整个目的。检查程序集或不签入任何包文件夹都将获得成功构建,但更好的做法是不将nuget包检查到源代码管理中。
答案 32 :(得分:1)
我通过安装Nuget包解决了这个问题:Microsoft ASP.NET Web API 2.2客户端库。这反过来安装了newtonsoft.json版本6.04
答案 33 :(得分:1)
对我来说问题是Newtonsoft.Json的折旧版本。重新安装没有帮助。
在Visual Studio中,转到“工具” - >“管理NuGet包”。选择更新。搜索Newtonsoft。单击“更新”以安装最新版本。
答案 34 :(得分:1)
对开放主题的另一个建议。运行&#34; Analyze&#34;后出现错误:项目设置中的某些内容已更改。问题在于:
项目/设置/构建/平台目标
出现&#34;任何CPU&#34; 。
回到 x86 (或者在您的情况下可能 x64 )解决了这个问题。
答案 35 :(得分:0)
您可以从引用内的属性中找到已安装的ur库版本。对于我的情况,我安装了8.0.0.0。错误说Could not load file or assembly 'Newtonsoft.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.
所以我必须在web.config中手动添加以下内容
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" />
<bindingRedirect oldVersion="6.0.0.0-8.0.0.0" newVersion="8.0.0.0" />
</dependentAssembly>
答案 36 :(得分:0)
我一直在努力奋斗一天左右,尝试过每一个解决方案。 帮助我的是检查app.config中的大写字母。
,我改变它后突然工作了PublicKeyToken而不是publicKeyToken答案 37 :(得分:0)
除了这里的许多答案之外,我发现了一些因此添加它的内容。首先,确保dll不是从GAC引用的。除此之外,
在添加/更改Newtonsoft.Json的dll时,有时项目的* .csproj不会被更改,或者json dll的更改版本不会反映在解决方案的csproj中。
所以在notepad ++中打开项目并搜索Newtonsoft.Json并将JSON从旧版本重命名为新版本。现在切换回VS后,解决方案/项目将重新加载所需的版本Newtonsoft.JSON dll。
答案 38 :(得分:0)
在我的情况下,我的文件夹名为Newtonsoft.Json.6.0.7
但是.csproj
文件具有通过文件夹...\Newtonsoft.Json.6.0.5\...
的路径
将.csproj
文件更改为具有6.0.7版可解决此问题。
答案 39 :(得分:0)
我遇到了同样的错误,并通过添加以下代码错误解决了生产问题。
答案为时已晚,但可能会对某人有所帮助。
<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>
答案 40 :(得分:0)
对于最简单的解决方案,您可以将项目文件设置为自动为您生成绑定重定向:
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup>
答案 41 :(得分:0)
这很老了,似乎仍然有很多人对同一件事有疑问。因此,我想分享一下我的经验,它可能会对某人有所帮助。
我在两个地方都遇到过同样的问题。在一个项目用户6.0.4.0中,在不同项目中使用4.5.0.0。
1-这对我有用。在bin文件夹中,我有6.0.0.0 Newtonsoft.Json.dll和指向4.5.0.0 dll的符号链接
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<probing privatePath="bin\4.5dlls-path;" />
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed"
culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
如果您不知道如何创建符号链接here。
mklink / D“文件夹名称”“ dll的路径”
2-在这种情况下,当我从Web配置文件中删除该部分时,它起作用了。请记住,我在不同的项目中都引用了6.0.0.0和4.5.0.0。在符号链接中,我有12.0.1.0 dll和bin 6.0.0.0。
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<probing privatePath="bin\12.0.1dlls-path;" />
</dependentAssembly>
</assemblyBinding>
</runtime>
3-我还有一个解决方案。如果您在不同的项目中拥有不同版本的Newtonsoft.Json.dll,请尝试将它们全部升级到一个版本或最新版本,但是在某些情况下,它可能无法正常工作。例如:System.Net.Http.Formatting.dll可能需要Nettonsoft.Json.dll 6.0.0.0的版本。在这种情况下,您需要视觉6.0.0.0,因此请尝试使所有版本都相同。希望这对某些人有帮助。
答案 42 :(得分:0)
我遇到了同样的问题,并且在尝试创建MassTransit队列时遇到了异常:
"Exception: System.TypeInitializationException: The type initializer for 'MassTransit.Serialization.JsonMessageSerializer' threw an exception. ---> System.IO.FileLoadException: Could not load file or assembly 'Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)"
对我有用的解决方案(花了几天恢复了几次提交后):
我们有一个Windows服务解决方案,其中包含.Service项目和.XUnitTests项目。他们两个都使用依赖于Newtonsoft.Json.dll的通用nuget。在两个项目中都没有明确引用Newtonsoft.Json nuget包(但是我们在类中使用的是'using Newtonsoft.Json;'名称空间),因此默认情况下,常见的nuget使用的是Newtonsoft.Json版本9。
在.Service和.XUnitTests项目中都安装了Newtonsoft.Json nuget之后,常见的nuget软件包开始使用最新的v12 Newtonsoft,并且解决了我的问题。
只要将它张贴在这里,就可以节省任何人的宝贵时间。