将错误版本的 .NET 程序集复制到 Web 窗体 bin 目录

Wrong version of .NET assembly getting copied to Web Forms bin directory

我正在开发一个 ASP.NET Web 表单网站,经常遇到 运行 次异常,如下所示:

Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
=== Pre-bind state information ===
LOG: DisplayName = Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
 (Fully-specified)
LOG: Appbase = file:///C:/Code/MyProject/
LOG: Initial PrivatePath = C:\Code\MyProject\bin
Calling assembly : System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Code\MyProject\web.config
LOG: Using host configuration file: \foo\bar\Profile.v2\simonm\Documents\IISExpress\config\aspnet.config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Redirect found in application configuration file: 4.5.0.0 redirected to 11.0.0.0.
LOG: Post-policy reference: Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed
LOG: Attempting download of new URL file:///C:/Users/simonm/AppData/Local/Temp/Temporary ASP.NET Files/vs/8d6ca9e7/1d38a78a/Newtonsoft.Json.DLL.
LOG: Attempting download of new URL file:///C:/Users/simonm/AppData/Local/Temp/Temporary ASP.NET Files/vs/8d6ca9e7/1d38a78a/Newtonsoft.Json/Newtonsoft.Json.DLL.
LOG: Attempting download of new URL file:///C:/Code/MyProject/bin/Newtonsoft.Json.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.

它们总是因为程序集的 "wrong" 版本(似乎总是 Newtonsoft.Json)被复制到 Bin 目录,尽管 [=27] =] 在网站的根目录中有:

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

并且 web.config 包含:

<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-11.0.0.0" newVersion="11.0.0.0" />
</dependentAssembly>

有人可以解释是什么决定了将哪个程序集复制到 Bin 目录,为什么这种情况一直发生以及如何防止它在将来发生?

我猜,您使用的一些 frameworks/libraries 正在使用不同版本的 Newtonsoft.Json。首先,检查您的 frameworks/libraries 是否需要不同版本的 Newtonsoft.Json 库。

当您检测到哪个是 Newtonsoft.Json 所需的(最低)版本时,请尝试通过 Nuget 重新安装此版本。

这似乎是由多种因素引起的,但最终归结为在 Bin 目录中有一个 .refresh 文件指向与 [= 中引用的版本不同的程序集版本18=].

看起来这些 .refresh 文件是在您(由于 Update-Package 等原因而手动或自动)添加对 ASP.NET 项目的引用时添加的。如果您查看 .refresh 文件的内容,它只是 .dll 文件的路径。构建时,MSBuild(我假设)检查 Bin 目录中的 Foo.dll 是否与 Foo.dll.refresh 引用的匹配,如果不匹配,则复制 .refresh 文件引用的那个进入您的回收站。

我认为这与将 Git 中的分支切换到引用 web.config 中引用的不同版本的分支以及不在版本控制中的 .refresh 文件相结合是导致的原因这些问题。