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

问题描述 投票:36回答:8

当我构建除包含引用的网站之外的任何其他项目时,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" />

这会将dependenAssembly绑定添加到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'设置为对Newtonsoft.Json.DLL为true。

c# visual-studio-2012 dll visual-studio-2013 .net-4.5
8个回答
28
投票

这是Windows Azure VS Tools中已知错误

解决方法:

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

  • 卸载Windows Azure VS Tools v 2.3


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中


5
投票

问题

您的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站点可能会失败并显示异常页面,并在错误消息中显示以下文本:

日志:尝试下载新的URL newtonsoft json

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

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


3
投票

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

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


3
投票

我的场景几乎完全相同,只是我的Newtonsoft.JSON DLL是从不同的位置复制的。 我验证了我的解决方案引用了正确的文件和版本,但是在RUN VS上从另一个位置复制了它(首先通过将BIN DLL拖入VS或属性来检查它。

最后,在使用Fusion日志逐个尝试它们之后,我全力以赴地替换了程序文件中具有相同错误版本的Newtonsoft.JSON.dll的所有引用:

  • 'C:\\ Program Files(x86)\\ Microsoft SDKs \\ Microsoft Azure \\ Mobile Services \\ 1.0'
  • 'C:\\ Program Files \\ Common Files \\ Microsoft Shared \\ Visual Studio \\ 12.0'
  • 'C:\\ Program Files(x86)\\ Microsoft Visual Studio 12.0 \\ Blend'
  • 等等

快速提示:在详细信息视图下的资源管理器中,将“产品版本”添加为列并按其排序: 在此输入图像描述

如果我为该程序集设置特定版本并且文件路径是正确的DLL(由NuGet设置)它仍然应该从另一个共享全局位置覆盖它,它仍然感觉像糟糕的IDE行为。 任何改变Visual Studio构建行为的评论都将受到赞赏,因为我真的不想在每台开发者机器上进行这种类型的手动黑客攻击。

在此输入图像描述


3
投票

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

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

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


2
投票

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


0
投票

我有同样的问题,经过测试所有解决方案我继续得到错误。 似乎是因为多种原因会发生此错误。

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

© www.soinside.com 2019 - 2024. All rights reserved.