Newtonsoft.Json 问题:无法从源加载文件或程序集异常 System.Net.Http.Formatting
Newtonsoft.Json issue: could not load file or assembly exception from source System.Net.Http.Formatting
我在 .NET 4.5 中完成了一项 Windows 服务。它引用位于另一个 Visual Studio 解决方案中的 DLL,比方说,myCustomDLL。 myCustomDLL 引用了 Newtonsoft.Json DLL 版本 11.0.1,还引用了 System.Net.Http.Formatting 版本 5.2.6.0。
当我从 Visual Studio 调试我的 window 服务并调用 myCustomDLL 中的函数时,我收到错误:
Could not load fiile or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.
Source: System.Net.Http.Formatting
StackTrace:
at System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor()
at System.Net.Http.Formatting.MediaTypeFormatterCollection.CreateDefaultFormatters()
at System.Net.Http.Formatting.MediaTypeFormatterCollection..ctor()
at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content)
at My.Namespace.MyAPI.Send(TaskData data) en d:\MyProjects\Dev\My.Custom.Namespace\myApi.cs:line 80
我没有在 myCustomDLL 上安装任何 Newtonsoft.json DLL 版本 4.5.0.0。
我的 windows 服务(在 vb.net 中完成)也添加了指向 Newtonsoft.Json 版本 11.0.1 的引用。
解决方案:
最后,我完成了@Richard 在评论中建议的内容,nilsK 做出了回答。
Windows 服务添加了对正确 Newtonsoft.Json (11.0.1) 的引用,但是 windows 服务配置文件 (app.config) 中缺少 assemblyBinding 行,所以我添加了它们并有效:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
</assemblyBinding>
写在这里,因为更好的格式......我只是想添加到@Richard 的评论中。
在您的 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-4.5.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
将该版本号更改为您需要的版本,即“11.0.1”(或“12.0.3”,当前稳定版本)。
如果将绑定重定向添加到 Web.config 后仍继续抛出 System.IO.FileLoadException
,则可能是绑定 runtime/assemblyBinding
配置块中存在语法错误。
例如,由于合并错误,我在同一个 <dependentAssembly/>
块中有两个 <bindingRedirect/>
块。这导致all<bindingRedirect/>
不生效,导致运行时找不到dll。我可以想象其他细微的语法错误也会产生同样的副作用。
<runtime>
<assemblyBinding>
...
<!-- Problematic dependentAssembly line -->
<dependentAssembly>
<assemblyIdentity name="PackageA" publicKeyToken="token" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
<!-- Example of syntax error -->
<!-- Two sets of bindingRedirects should NOT be placed in the same dependentAssembly -->
<assemblyIdentity name="PackageB" publicKeyToken="token" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
<dependentAssembly/>
</assemblyBinding>
</runtime>
我在 .NET 4.5 中完成了一项 Windows 服务。它引用位于另一个 Visual Studio 解决方案中的 DLL,比方说,myCustomDLL。 myCustomDLL 引用了 Newtonsoft.Json DLL 版本 11.0.1,还引用了 System.Net.Http.Formatting 版本 5.2.6.0。
当我从 Visual Studio 调试我的 window 服务并调用 myCustomDLL 中的函数时,我收到错误:
Could not load fiile or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies.
Source: System.Net.Http.Formatting
StackTrace:
at System.Net.Http.Formatting.JsonMediaTypeFormatter..ctor()
at System.Net.Http.Formatting.MediaTypeFormatterCollection.CreateDefaultFormatters()
at System.Net.Http.Formatting.MediaTypeFormatterCollection..ctor()
at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content)
at My.Namespace.MyAPI.Send(TaskData data) en d:\MyProjects\Dev\My.Custom.Namespace\myApi.cs:line 80
我没有在 myCustomDLL 上安装任何 Newtonsoft.json DLL 版本 4.5.0.0。
我的 windows 服务(在 vb.net 中完成)也添加了指向 Newtonsoft.Json 版本 11.0.1 的引用。
解决方案: 最后,我完成了@Richard 在评论中建议的内容,nilsK 做出了回答。 Windows 服务添加了对正确 Newtonsoft.Json (11.0.1) 的引用,但是 windows 服务配置文件 (app.config) 中缺少 assemblyBinding 行,所以我添加了它们并有效:
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>
</assemblyBinding>
写在这里,因为更好的格式......我只是想添加到@Richard 的评论中。
在您的 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-4.5.0.0" newVersion="4.5.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
将该版本号更改为您需要的版本,即“11.0.1”(或“12.0.3”,当前稳定版本)。
如果将绑定重定向添加到 Web.config 后仍继续抛出 System.IO.FileLoadException
,则可能是绑定 runtime/assemblyBinding
配置块中存在语法错误。
例如,由于合并错误,我在同一个 <dependentAssembly/>
块中有两个 <bindingRedirect/>
块。这导致all<bindingRedirect/>
不生效,导致运行时找不到dll。我可以想象其他细微的语法错误也会产生同样的副作用。
<runtime>
<assemblyBinding>
...
<!-- Problematic dependentAssembly line -->
<dependentAssembly>
<assemblyIdentity name="PackageA" publicKeyToken="token" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
<!-- Example of syntax error -->
<!-- Two sets of bindingRedirects should NOT be placed in the same dependentAssembly -->
<assemblyIdentity name="PackageB" publicKeyToken="token" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
<dependentAssembly/>
</assemblyBinding>
</runtime>