将 ASP.NET MVC 5 添加到运行 WebForms 的旧 ASP.NET Web 应用程序后,我遇到了同样的问题。我想添加新功能并在 MVC 平台上构建它们,因此让 MVC 和传统 Web 应用程序并行运行非常重要。我在这里写这个答案是因为我在 stackoverflow 和其他地方找到的所有解决方案,包括为您现在正在阅读的主题选择的解决方案,都没有帮助我。也许我的发现会对那里的人有所帮助......
当我将 MVC 5 添加到 Web 应用程序项目中时,它安装了一堆引用,例如 System.Web.Mvc、System.Web.Razor 等。还安装了名为 Microsoft.AspNet.Web.Optimization 的 NuGet 包,它参考了 WebGrease;你和我的参考有问题。
我的 Web 项目中安装的优化 dll 版本是 Microsoft.AspNet.Web.Optimization 1.1.3,这是目前的最新版本。WebGrease 版本 1.5.2 随附。
有趣的是我在_Layout.cs中执行@Styles.Render("~/Content/css")语句时得到的错误信息,指的是WebGrease 1.5.1版本。我不知道它从哪里得到 1.5.1 版本,因为 1.5.2 安装在我的 Web 项目中。我尝试卸载 WebGrease 并重新安装,尝试将 WebGrease 升级到最新版本(1.6.5135)。我确定这些 dll 都没有安装在 GAC 中(它们没有安装)。我删除了“C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\”中的所有临时文件,但都无济于事。
当我运行我的 Web 应用程序时,我使用名为 Fuslogvw.exe 的程序来记录所有绑定信息,希望我能找到一个合乎逻辑的原因,说明为什么我的应用程序在运行时坚持尝试加载旧的、不存在的 WebGrease 版本我的应用程序。有趣的是,日志的输出显示了应用程序在做什么,但遗憾的是没有告诉我原因。日志告诉我,尽管我安装了 Microsoft.AspNet.Web.Optimization 1.1.3 版和 WebGrease 1.5.2 版,但它尝试加载 Microsoft.AspNet.Web.Optimization 1.1.0.0 版,它也带有旧版本WebGrease 的。为什么这样做?我不知道,因为我以前从未在我的 PC 上的任何项目中添加过优化。
我的解决方案是同时删除 Microsoft.AspNet.Web.Optimization 和 WebGrease(按此顺序),然后在包管理器控制台中运行以下命令来安装 Microsoft.AspNet.Web.Optimization 1.1.0 版:
Install-Package Microsoft.AspNet.Web.Optimization -Version 1.1.0
这导致安装了 WebGrease 1.3.0 版,在加载使用 _Layout.cshtml 页面的 MVC razor 视图时不会导致任何问题。
对于那些感兴趣的人:下面您可以看到 Fuslogvw.exe 生成的日志的输出,其中清楚地指出它试图加载不存在的 1.1.0 版本的优化:
*** Assembly Binder Log Entry (26.11.2018 @ 13:19:59) ***
The operation failed.
Bind result: hr = 0x80131040. No description available.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
Running under executable c:\windows\system32\inetsrv\w3wp.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: DisplayName = WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35
(Fully-specified)
LOG: Appbase = file:///C:/Projects/MyProject/Web/
LOG: Initial PrivatePath = C:\Projects\MyProject\Web\bin
LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\myproject\1db399c5
LOG: Cache Base = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\myproject\1db399c5
LOG: AppName = 3f7f1cb1
Calling assembly : System.Web.Optimization, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Projects\MyProject\Web\web.config
LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config\machine.config.
LOG: Post-policy reference: WebGrease, Version=1.5.1.25624, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: GAC Lookup was unsuccessful.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/ipmvcang/1db399c5/3f7f1cb1/WebGrease.DLL.
LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/ipmvcang/1db399c5/3f7f1cb1/WebGrease/WebGrease.DLL.
LOG: Attempting download of new URL file:///C:/Projects/MyProject/Web/bin/WebGrease.DLL.
LOG: Assembly download was successful. Attempting setup of file: C:\Projcets\MyProject\Web\bin\WebGrease.dll
LOG: Entering download cache setup phase.
LOG: Assembly Name is: WebGrease, Version=1.6.5135.21930, Culture=neutral, PublicKeyToken=31bf3856ad364e35
WRN: Comparing the assembly name resulted in the mismatch: Minor Version
ERR: The assembly reference did not match the assembly definition found.
ERR: Setup failed with hr = 0x80131040.
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.