“未能加载文件或程序集“System.Web.WebPages.Razor”的一种解决方案

在ASP.NET WEB项目中,如果web.config中定义的程序集与实际应用的程序集不同,在项目运行时就会报“未能加载文件或程序集“System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)”这类的错误,如下图所示。

“未能加载文件或程序集“System.Web.WebPages.Razor”的一种解决方案

一般来说遇到这种问题的时候修改一下引用版本,或者添加缺少的引用就可以了,但是我在开发一个MVC项目中遇到一个问题:引用列表和web.config中显示的引用版本都是2.0,但项目运行时提示缺少System.Web.WebPages.Razor 3.0版本的引用,也就是说报错的是我没有引用的版本。

“未能加载文件或程序集“System.Web.WebPages.Razor”的一种解决方案

我一开始以为是缓存问题,重新添加引用,清理项目再生成项目,还是报错。

然后怀疑是版本问题,重新添加3.0的引用,重新运行后报web下另一个程序集的错误,再改,改了大概3,4个程序集后运行正常。但是代码提交到同事那里报一样的错误,还需要手动改一遍引用,于是继续分析原因,然后看到这么个东西。

 

“未能加载文件或程序集“System.Web.WebPages.Razor”的一种解决方案

看到调用程序集这个地方就大概明白了,其实是MVC的依赖项包含的System.Web.WebPages.Razor 3.0版本,所以在运行时报错。手动把MVC引用改为4.0,之前的几个引用改回2.0。运行成功。

在NUGET上面查了一下

“未能加载文件或程序集“System.Web.WebPages.Razor”的一种解决方案

 

果然是MVC的依赖项问题。(NUGET上只显示最新版本,这个MVC是5.2.6的)

我后来又试了一下,有的MVC项目中如果依赖项有冲突,在编译时就会报错,但有的项目只在运行时报错。这时候就很难去调试,因为配置文件和代码中都看不出什么问题,页面的报错信息也很不明显。