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

lec*_*ind 37 c# dll .net-4.5 visual-studio-2012 visual-studio-2013

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

这会将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>
Run Code Online (Sandbox Code Playgroud)

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

我最近更新了从.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)
Run Code Online (Sandbox Code Playgroud)

我跟踪了这​​一事实,当重建其中一个类库或从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.

Ale*_*kov 28

这是一个已知的bug,Windows Azure的VS工具

解决方法:

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

  • 卸载Windows Azure VS Tools v 2.3

  • 与v2.8相同的问题.我不得不重命名文件夹C:\ Program Files\Microsoft SDKs\Azure\.NET SDK\v2.8\bin\plugins\Diagnostics (4认同)

Wil*_*ert 7

问题

您的csproj包含一个指向Newtonsoft.Json dll的无效路径的引用。就我而言,

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

而不是设置的一个NuGet packages\Newtonsoft.Json.8.0.3\...(包括版本号)。

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

解决方案

上面的某些解决方案(删除在系统中找到的所有Newtonsoft.Json.dll)可能会在短期内隐藏问题,但仅修复csproj指向正确的NuGet提供的路径才能真正解决问题。

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

如果您有bash,可以使用

$ grep -r HintPath * | grep Newtonsoft

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

相关错误

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

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

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

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


nsb*_*nsb 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中


小智 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 停止替换我引用的版本,并且网站再次开始工作。