将 ASP.NET MVC 从 4 升级到 5 的奇怪错误

Posted

技术标签:

【中文标题】将 ASP.NET MVC 从 4 升级到 5 的奇怪错误【英文标题】:Weird Error Upgrading ASP.NET MVC from 4 to 5 【发布时间】:2016-06-29 15:32:57 【问题描述】:

我正在将我的项目从 MVC 4 转换为 MVC 5(并将 .Net 4 转换为 .Net 4.5.2,这是改变的真正驱动力。)

当我运行我的一个页面时,我收到了这个错误(我添加了空格以便于阅读)

[A]System.Web.WebPages.Razor.Configuration.HostSection 无法转换 到 [B]System.Web.WebPages.Razor.Configuration.HostSection。

类型 A 源自 'System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 在上下文中 位置的“默认” 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_1.0.0.0__31bf3856ad364e35\System.Web.WebPages.Razor.dll'。

类型 B 源自 'System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 在上下文中 位置的“默认” 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\studentportal3g\2204bad2\aece9b3b\assembly\dl3\ad80387c\91adbf51_fc73d101\System.Web.WebPages.Razor.dll'。

当我第一次看到这个的时候,很容易啊!没那么多:)

我检查了每个项目,并确保它的版本升级到 MVC 5,其中包含 System.Web.WebPages.Razor.dll 的 3.0.0.0 版本。

清理重建,仍然得到错误。没问题,我会删除缓存的临时文件。

清理重建,仍然有问题。我回去,手动检查每个版本的 System.Web.WebPages.Razor.dll,在每个项目的引用中都有对其的引用。我检查了我复制 dll 以手动引用它们的文件夹,它不存在。

如果我的解决方案不包含 DLL 的副本或对 DLL 的引用,并且我手动删除了 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary 中的缓存文件夹ASP.NET

文件\studentportal3g...

旧的坏 dll 来自哪里?如何修复此错误?如何防止它再次发生?

谢谢,

埃里克-

【问题讨论】:

看起来 DLL 存储在 Global Assembly Cache 中。将 GAC 中的程序集更新为新的。 【参考方案1】:

Visual Studio 是一个很棒的工具,但它在升级依赖项时并不总是做出正确的选择,也不支持 MSBuild 中所有可能的选项。每当您发现自己处于此类绑定中时,您应该手动查看并(如有必要)编辑您的 .csproj 文件以解决它。

问题不在于您的文件存在于 GAC 中,也不是 NuGet 未安装该文件,问题很可能是您的项目文件之一仍然引用了旧版本的 System.Web.WebPages.Razor 版本 @ 987654324@,你需要找到所有对它的引用并将它们相应地更改为3.0.0.0

    在解决方案资源管理器中右键单击您的项目节点,然后单击Unload Project。 再次右键项目节点,点击Edit <projectName>.csproj。 在文件中搜索对System.Web.WebPages.Razor 的引用并相应地更新版本和HintPath(如下所示)。确保您使用的 HintPath 实际上指向现有文件。 对解决方案中的所有依赖项目(以及不属于解决方案的 DLL 中的任何项目)重复这些步骤。

旧参考

<Reference Include="System.Web.WebPages.Razor, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
    <Private>True</Private>        
    <HintPath>..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll</HintPath>
</Reference>

更新参考

<Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
</Reference>

您还应该检查web.config/Views/web.config 文件,以确保它们没有引用此程序集的任何旧版本。

注意:如果上述说明无法解决您的问题,则该问题可能超出您的解决方案。很可能有一个第 3 方库在某处引用该文件的旧版本。如果是这样,您可以尝试获取 DLL 的更新版本。

您可能还想查看this question。

【讨论】:

这不是 CsProjs,但在过去某个时间,一个工具显然添加了一些小的 web.cofigs,它们引用了 1.0.0.0,将它们全部更新为 3,现在它可以工作了.谢谢!【参考方案2】:

看起来旧 DLL 位于全局程序集缓存 (GAC) 中。 GAC 是您可以存储可以从机器上的多个应用程序引用的程序集的地方。 Click here 了解有关 GAC 的更多信息。

使用工具gacutil 更新 GAC 中的程序集。

该工具位于 Program Files 中“Microsoft SDKs”文件夹下的某个位置。对我来说,它位于

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\

打开 cmd 并导航到我存储 gacutil 的位置。然后像这样使用它:

gacutil.exe -i [path to your assebly] -f.

-i 参数用于指示您的程序集所在的位置。 -f 参数用于强制更新程序集,如果它已经存在的话。

示例

假设你的 DLL 位于

C:\temp\System.Web.WebPages.Razor.dll

然后你会运行gacutil.exe -i "C:\temp\System.Web.WebPages.Razor.dll" -f

【讨论】:

谢谢,尽管您的问题似乎出在其他地方。很高兴你把它修好了:-)

以上是关于将 ASP.NET MVC 从 4 升级到 5 的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 4.0 升级到 5.0遇到的问题及解决思路

升级到 ASP.NET MVC 5 错误 403.14 Forbidden

ASP.NET从MVC5升级到MVC6

将 asp.net Mvc 从 3 降级到 2

从 GitHub 持续部署在 Azure 中失败(ASP.NET 5 和 MVC 6)

如何将数据从表示层传递到业​​务逻辑层? (ASP.NET MVC 5)