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

时间:2019-03-18 10:33:03

标签: asp.net webforms nuget web-config .net-assembly

我在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.

总是因为程序集的“错误”版本(它总是看起来是Newtonsoft.Json)被复制到Bin目录,尽管在站点根目录中的packages.config具有:

<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目录,为什么这种情况一直发生以及如何防止将来发生吗?

2 个答案:

答案 0 :(得分:1)

我想,您使用的某些框架/库正在使用Newtonsoft.Json的不同版本。首先,检查您的框架/库是否需要Newtonsoft.Json库的不同版本。

当您检测到Nuget的(最低)必需版本时,请尝试通过for($i =0;$i<count($arr);$i++){ if(isset($arr[$i]['catname']) && $arr[$i]['catname']=='emerging-p2p'){ echo $arr[$i]['dst_mac']; } } 重新安装该版本。

答案 1 :(得分:0)

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

当您(由于Update-Package而手动或自动)添加对ASP.NET项目的引用时,似乎添加了这些.refresh文件。如果您查看.refresh文件的内容,那只是.dll文件的路径。生成时,MSBuild(我假设)检查Bin目录中的Foo.dll是否与Foo.dll.refresh引用的文件匹配,如果不匹配,请将.refresh文件引用的文件复制到Bin中。

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