升级MVC项目至.NET 4.8后Microsoft.Web.Infrastructure版本冲突问题
问题描述
将旧MVC项目的目标框架从4.6升级到4.8,同时把所有NuGet包更新至最新稳定版本,其中Microsoft.Web.Infrastructure升级到了2.0.0.0版本。项目及依赖项目编译均成功,但运行时出现错误,提示只能加载1.0.0.0版本的该程序集;若将其降级至1.0.0.0版本,又会出现对已升级至3.3.6.0的Ninject的3.3.4.0版本依赖需求。推测应用配置、主机配置与机器配置之间存在冲突,目前仅在package.config中提及该DLL。
错误日志
未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT:0x80131040) 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.IO.FileLoadException: 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT:0x80131040) 源错误: 执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。 程序集加载跟踪: 下列信息有助于确定程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”未能加载的原因。 === 预绑定状态信息 === LOG: 显示名称 = Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (完全指定) LOG: Appbase = file:///C:/Users/myName/Source/repos/myOrg/myProject/DBRN/DBRN/ LOG: 初始私有路径 = C:\Users\myName\Source\repos\myOrg\myProject\DBRN\DBRN\bin 调用程序集: System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35。 === LOG: 此绑定在默认加载上下文中启动。 LOG: 使用应用程序配置文件: C:\Users\myName\Source\repos\myOrg\myProject\DBRN\DBRN\web.config LOG: 使用主机配置文件: \\myNetworkServer\Homedir$\myName\My Documents\IISExpress\config\aspnet.config LOG: 使用计算机配置文件从 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config。 LOG: 后策略引用: Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 LOG: 尝试下载新的 URL file:///C:/Users/myName/AppData/Local/Temp/1/Temporary ASP.NET Files/vs/f02f79de/18c40213/Microsoft.Web.Infrastructure.DLL。 LOG: 尝试下载新的 URL file:///C:/Users/myName/AppData/Local/Temp/1/Temporary ASP.NET Files/vs/f02f79de/18c40213/Microsoft.Web.Infrastructure/Microsoft.Web.Infrastructure.DLL。 LOG: 尝试下载新的 URL file:///C:/Users/myName/Source/repos/myOrg/myProject/DBRN/DBRN/bin/Microsoft.Web.Infrastructure.DLL。 WRN: 比较程序集名称时发现不匹配: 主版本 ERR: 未能完成程序集的设置 (hr = 0x80131040)。探测终止。 堆栈跟踪: [FileLoadException: 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT:0x80131040)] System.Web.WebPages.PreApplicationStartCode.Start() +0 System.Web.Mvc.PreApplicationStartCode.Start() +39 [InvalidOperationException: 类型 System.Web.Mvc.PreApplicationStartCode 上的预应用程序启动初始化方法 Start 引发了异常,异常消息为: 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT:0x80131040)。] System.Web.Compilation.BuildManager.InvokePreStartInitMethodsCore(ICollection`1 methods, Func`1 setHostingEnvironmentCultures) +890 System.Web.Compilation.BuildManager.InvokePreStartInitMethods(ICollection`1 methods) +167 System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +133 System.Web.Compilation.BuildManager.ExecutePreAppStart() +178 System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +746 [HttpException (0x80004005): 类型 System.Web.Mvc.PreApplicationStartCode 上的预应用程序启动初始化方法 Start 引发了异常,异常消息为: 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。(异常来自 HRESULT:0x80131040)。] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +552 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +122 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +737
解决方法
1. 添加程序集绑定重定向
在项目的web.config文件的<configuration>节点下添加<runtime>配置,通过绑定重定向让.NET运行时将对旧版本程序集的请求指向已安装的新版本:
<configuration> <!-- 其他配置节点 --> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <!-- 处理Microsoft.Web.Infrastructure版本冲突 --> <dependentAssembly> <assemblyIdentity name="Microsoft.Web.Infrastructure" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> </dependentAssembly> <!-- 处理Ninject版本冲突 --> <dependentAssembly> <assemblyIdentity name="Ninject" publicKeyToken="c7192dc5380945e7" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-3.3.6.0" newVersion="3.3.6.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
2. 验证NuGet包依赖兼容性
- 打开NuGet包管理器,选择“管理解决方案的NuGet程序包”
- 查看
Microsoft.Web.Infrastructure和Ninject的依赖项,确认两者的版本组合不存在硬性冲突 - 如果发现冲突,可以尝试调整其中一个包的版本到兼容的稳定版,或者查看包的发行说明确认兼容范围
3. 清理残留文件
- 删除项目的
bin和obj目录,重新生成项目 - 删除错误日志中提到的临时ASP.NET文件(路径如
C:/Users/myName/AppData/Local/Temp/1/Temporary ASP.NET Files/vs/...),避免旧版本程序集残留干扰加载
内容的提问来源于stack exchange,提问作者user266909
相关产品推荐
相关产品推荐

