【发布时间】:2014-03-18 21:01:12
【问题描述】:
当我构建除包含该引用的网站之外的任何其他项目时,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)。在网站中,我将 Newtonsoft.Json.DLL 的“本地复制”设置为 true,并且“特定版本”也设置为 true。
【问题讨论】:
-
我建议您为构建启用详细日志记录并跟踪 dll 的“错误”版本的确切来源。
-
完全一样的问题!在 NUGET 更新 OWIN、IDENTITY 和 EF 之后,我发现自己处于这种情况。在正确构建一个项目的同时,VS2013 将旧版本的 Newtonsoft.Json 放到其他项目中,旧版本与 GAC 中的相同。
标签: c# visual-studio-2012 dll visual-studio-2013 .net-4.5