当我构建除包含引用的网站之外的任何其他项目时,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。
答案 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 引用)。
经过大量跟踪找到了对我有用的解决方案。
所以尝试以下。
它开始按预期工作。