程序集引用无法解析 - dependentAssembly问题?

20

我在我的构建服务器上(TFS/Visual Studio Online)遇到以下错误:

CA0055 : Could not load C:\a\Binaries\Api.dll. The following error was encountered while reading module 'System.Net.Http.Formatting': Assembly reference cannot be resolved: Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed.
CA0058 : The referenced assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' could not be found. This assembly is required for analysis and was referenced by: C:\a\Binaries\Api.dll, C:\a\Sources\MyLocation\packages\Microsoft.AspNet.WebApi.Client.5.1.1\lib\net45\System.Net.Http.Formatting.dll.

这是我Api.dll项目中有关此程序集的dependentAssembly条目的web.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>

安装的Json.NET NuGet包的实际版本为6.0.1:

enter image description here

查看项目引用时,我拥有Newtonsoft.Json 6.0.0.0:

enter image description here

引用中 System.Net.Http.Formatting 的版本为5.1.0.0。

在生成定义中启用NuGet还原,并且在本地副本中没有这些错误,只出现在TFS中。

是否有人能够发现可能的问题?

我认为可能是由于dependentAssembly条目造成的,但我无法让它工作。


请使用Fusion Viewer来诊断绑定错误:http://msdn.microsoft.com/zh-cn/library/e74a18c4(v=vs.110).aspx。 - Polyfun
@Polyfun 我尝试了fuslogvw,但它完全没有任何作用。出现了一个空的对话框,我无法让它做任何事情。 - Alan Baljeu
5个回答

15
如果您已经清理了项目文件、包文件和引用,并且所有版本都是Newtonsoft的正确和最新版本,那可能是一个依赖于早期版本Newtonsoft.Json的.Net dll。在我的情况下,它是System.Net.Http.Formatting,Version = 4.0.0.0:

输入图像描述

尝试将以下内容添加到“调用”项目的*.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>

在对WebAPI项目运行测试项目时,由于Newtonsoft.Json版本不匹配(分别为4.5.0.0和6.0.1.0),导致WebAPI抛出了“文件未找到”异常。将 调用 测试项目的 app.config 文件中添加相应声明可以解决此问题。


将该语句添加到调用测试项目的app.config中解决了问题。这完全解决了我的问题。在使用System.Net.Http.Formatting的项目中,重定向已经被设置,但这还不够。每个调用该项目的其他项目也必须具有此重定向。 - Zoran P.
仅供参考,<dependentAssembly> 标签嵌套在 configurationruntimeassemblyBinding 中。https://learn.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/dependentassembly-element - SharpC
我的调用项目没有任何配置文件?其他项目有,但这个没有。 - Alan Baljeu

14

这个问题是一些意料之外的东西。

解决方法是在每个相关的 <PropertyGroup> 部分的项目文件中包含以下行:

<CodeAnalysisAdditionalOptions>/assemblyCompareMode:StrongNameIgnoringVersion</CodeAnalysisAdditionalOptions>

要编辑项目文件,右键单击项目,然后单击取消加载项目。现在右键单击已卸载的项目,选择编辑MyProject.csproj


3
我们的测试服务器出现了同样的问题,但它在我的开发机上运行正常,而 <dependentAssembly>..<bindingRedirect> 对我无效。我也尝试了 StrongNameIgnoringVersion ,但并没有成功。这已经花费了我好几天的时间。你还有其他的想法吗? - CRG
1
这个救了我的一天。当你无法直接修改代码分析配置时(在公司的构建服务器上通常是这样),这就是正确的方法。 - SuperJMN

3

在我的情况下,Newtonsoft.Json绑定重定向没有起作用,因为某种原因,根web.config文件不是已部署的文件的一部分。

检查您的web.config文件的属性。在我们的情况下,“Build Action”值设置为“None”。它应该设置为“Content”,以便成为部署到服务器的文件的一部分。

这也解释了为什么网站在(本地)IISexpress上工作但不在完整的IIS实例上工作。


0

我曾经遇到过同样的问题,但是这是在我的本地开发机上,而且是一个非常老的网站解决方案。

问题在于 web.config 中存在来自 .Net Framework 版本 4 之前的旧“残留物”。

所以必须更改从: 到:

换句话说,删除粗体部分 appliesTo="v2.0.50727",如果不进行此更改,则会出现以下错误:无法加载文件或程序集“Newtonsoft.Json,版本=6.0.0.0。”

我为此苦苦挣扎了几天,尝试了很多不同的解决方案,但都没有奏效,而这个帖子是我找到的最接近讨论它的。显然,这可能会影响任何 assemblybinding,而不仅仅是 Newtonsoft。 希望这能帮助其他人。


0
我发现尽管我创建的类库引用了和,但只有前者被复制到需要它的调用项目的bin目录中。
将添加到主调用项目的引用中解决了我遇到的问题:
"System.IO.FileNotFoundException"类型的未处理异常发生在System.Net.Http.Formatting.dll中。 附加信息: 找不到文件或程序集"Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"或其某个依赖项。系统无法找到指定的文件。

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