Visual Studio会使用旧版本覆盖NewtonSoft.Json.DLL

时间:2014-03-18 21:01:13

标签: c# visual-studio-2012 dll visual-studio-2013 .net-4.5

当我构建除包含引用的网站之外的任何其他项目时,Visual Studio正在覆盖我在项目引用和NuGet包文件中配置的NewtonSoft.Json.DLL的正确版本。

行。这是场景:

我有一个后端服务和网站的解决方案。该网站在.NET 4.5上运行,并配置了NuGet以引入Newtonsoft.Json.DLL的6.0.1版本。

<package id="Newtonsoft.Json" version="6.0.1" targetFramework="net45" />

将依赖的组件绑定添加到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>

我可以毫无问题地构建和运行这个网站。

我最近更新了从.NET 4.0到.NET 4.5的所有类库和后端服务。更新后,每当我构建一个类库或运行/调试后端服务时,网站就无法运行。

Could not load file or assembly 'Newtonsoft.Json' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我追溯到这样一个事实:当重建其中一个类库或从Visual Studio运行/调试后端服务时,Newtonsoft.Json.DLL会被旧版本的文件 - 版本4.5.11覆盖。由于显式的dependentAssembly绑定,在我访问网站之后,我得到上面提到的“无法加载...”错误。

如果我只是想运行后端服务或网站中的一个或另一个,那就没关系,但我必须同时运行它们才能让我的应用程序正常运行。但是由于这个错误,我无法在网站或网站崩溃的同时运行后端服务。

如何阻止Visual Studio覆盖DLL?

请注意,我在整个解决方案中只有6.0.1的引用集(即没有引用任何地方到4.5.11)。在网站中,我将'Copy Local'设置为true,并将'Specific Version'设置为true,用于Newtonsoft.Json.DLL。

8 个答案:

答案 0 :(得分:26)

这是 Windows Azure VS工具

中的known bug

解决方法:

  • 从Program Files \ Microsoft中删除Newtonsoft.Json.dll文件 SDKs \ Windows Azure.NET SDK \ v2.3 \ ref \ folder。

  • 卸载Windows Azure VS Tools v 2.3

答案 1 :(得分:5)

这是我的情况 3个项目正在解决。 项目A和B引用了Newtonsoft.Json.DLL 6.0.3和项目C的解决方案参考。项目C没有明确引用Newtonsoft.Json.DLL
在构建解决方案时,它构建C,然后A和B - 在bin中删除正确的dll。 但是当我只构建C VS将旧版本的dll删除到A和B.由于没有明确的引用或绑定重定向存在,它从GAC获取它。 同时只构建A将较旧的dll丢入B中,因为它首先将错误版本的C版本构建到A和B中,然后构建A以放置正确的版本。

以下是解决方案 - 明确将Newtonsoft.Json.DLL 6.0.3添加到项目C

答案 2 :(得分:4)

问题

您的csproj包含一个带有Newtonsoft.Json dll无效路径的引用。就我而言,它是

<HintPath>..\..\packages\Newtonsoft.Json\lib\net45\Newtonsoft.Json.dll</HintPath>

代替一个NuGet 应该设置packages\Newtonsoft.Json.8.0.3\...(包括版本号)。

由于VS找不到dll,它只会搜索你的系统,并使用它找到的第一个。在我的系统上,那是Azure SDK 2.9,然后是Azure SDK 2.8,然后是VS12 / Blend /....

解决方案

上面的一些解决方案(删除你在系统中找到的所有Newtonsoft.Json.dlls)可能会在短期内隐藏问题,但只修复csproj以指向正确的NuGet提供的路径将真的解决了这个问题。

也就是说,确保csproj中的HintPath对应于安装NuGet包的包路径。

如果你有bash,你可以使用

$ grep -r HintPath * | grep Newtonsoft

在解决方案的根目录中找到有问题的csproj。

相关错误

如果您遇到此问题,使用web.config中的显式重定向启动Asp.Net站点可能会失败并显示异常页面,错误消息中包含以下文本:

  

日志:尝试下载新网址newtonsoft json

     

警告:比较程序集名称导致不匹配:主要版本

即使某些项目引用了Newtonsoft.Json 8.x的NuGet,VS也会愉快地编译,然后用它在系统上找到的古代DLL覆盖该DLL,并在运行时失败。

答案 3 :(得分:3)

我有完全相同的问题,并发现在C:\ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ v2.3 \ ref我有Newtonsoft.Json.dll与完全相同的日期和时间那个被复制到我的网站文件夹中的那个。

在C:\ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ v2.3 \ ref中重命名/删除Newtonsoft.Json.dll后,Visual Studio停止更换我引用的版本,并且网站再次开始工作

答案 4 :(得分:3)

我们最近遇到了同样的问题。我们的解决方案将在我们的开发机器上编译并拥有正确的DLL,但在我们的构建代理上,错误版本的Newtonsoft.Json将被丢弃在输出文件夹中。

经过大量时间的投入后,我们发现这是由在我们的构建代理上安装较新版本的Azure SDK的人员而不是本地人员触发的:2.9而不是2.5.1。

我们发现的解决方法是在解决方案的每个项目中包含Newtonsoft.Json NuGet包,即使项目不需要引用。

答案 5 :(得分:2)

我今天遇到了同样的问题。我发现在构建类库之后,该类库输出目录中的所有* .dll文件都被复制到任何具有该类库项目引用的Web项目的bin文件夹中。这可能导致兼容的组件被替换为不兼容的组件。但是,卸载Web项目时不会发生此dll xcopy(右键单击项目并选择“卸载项目”)。

答案 6 :(得分:0)

我有同样的问题,在测试完所有解决方案之后我仍然会遇到错误。似乎是因为多种原因会发生此错误。

在我的情况下,我使用VS 2015,问题是我的应用程序中使用较旧版本的newtonSoft的其他项目的未使用引用。我删除了引用,并且dll不再更改。

答案 7 :(得分:0)

我遇到了同样的问题。

我已经使用 nuget 安装了 newtonsoft 11.0 版本。

在构建或发布解决方案后,bin 文件夹中的 newtonsoft 引用被覆盖为 6.0 版本,并且发布的页面 dll 具有相同的 6.0 版本。 一切正常(package.config、debug、release 引用)。

经过大量跟踪找到了对我有用的解决方案。

所以尝试以下。

  1. 将诊断文件夹中的 newtonsoft.dll 文件重命名为以下位置 Program Files\Microsoft SDKs\Azure.NET SDK\v2.8\bin\plugins\Diagnostics

它开始按预期工作。