C# 将ASP.NET MVC从4升级到5时出现奇怪的错误

C# 将ASP.NET MVC从4升级到5时出现奇怪的错误,c#,asp.net-mvc,asp.net-mvc-4,razor,asp.net-mvc-5,C#,Asp.net Mvc,Asp.net Mvc 4,Razor,Asp.net Mvc 5,我正在将我的项目从MVC4转换为MVC5(并将.NET4转换为.NET4.5.2,这是更改的真正驱动因素) 当我运行其中一个页面时,会出现此错误(我添加了空白以便阅读) [A] 无法强制转换System.Web.WebPages.Razor.Configuration.HostSection 至[B]System.Web.WebPages.Razor.Configuration.HostSection 类型A源自“System.Web.WebPages.Razor,版本=1.0.0.0, 区域性

我正在将我的项目从MVC4转换为MVC5(并将.NET4转换为.NET4.5.2,这是更改的真正驱动因素)

当我运行其中一个页面时,会出现此错误(我添加了空白以便阅读)

[A] 无法强制转换System.Web.WebPages.Razor.Configuration.HostSection 至[B]System.Web.WebPages.Razor.Configuration.HostSection

类型A源自“System.Web.WebPages.Razor,版本=1.0.0.0, 区域性=中性,PublicKeyToken=31bf3856ad364e35'在上下文中 位置处的“默认值” 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Web.WebPages.Razor\v4.0_1.0.0_uuu31BF3856AD364E35\System.Web.WebPages.Razor.dll'

类型B源于'System.Web.WebPages.Razor,版本=3.0.0.0, 区域性=中性,PublicKeyToken=31bf3856ad364e35'在上下文中 位置处的“默认值” 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\studentportal3g\2204bad2\aece9b3b\assembly\dl3\ad80387c\91adbf51\u fc73d101\System.Web.WebPages.Razor.dll'

当我第一次看到这是虽然,啊容易!没那么多:)

我检查了每个项目,确保它的版本升级到MVC5,MVC5有3.0.0.0版本的System.Web.WebPages.Razor.dll

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

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

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

文件\studentportal3g

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

谢谢


Eric-

看起来旧DLL位于全局程序集缓存(GAC)中。GAC是一个可以存储可从计算机上的多个应用程序引用的程序集的地方。阅读更多有关GAC的信息

使用工具
gacutil
更新GAC中的部件

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

C:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.1工具\

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

gacutil.exe-i[组装路径]-f

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

例子 假设您的DLL位于

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


然后运行
gacutil.exe-i“C:\temp\System.Web.WebPages.Razor.dll”-f

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

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

  • 在“解决方案资源管理器”中右键单击项目节点,然后单击“卸载项目”
  • 再次右键单击项目节点,然后单击
    Edit.csproj
  • 搜索文件中对
    System.Web.WebPages.Razor的引用,并相应地更新版本和
    HintPath
    (如下所示)。确保使用的
    HintPath
    实际指向现有文件
  • 对解决方案中的所有依赖项目(以及DLL中不属于解决方案的任何项目)重复这些步骤
  • 旧参考文献
    
    真的
    ..\packages\Microsoft.AspNet.WebPages.1.0.20105.408\lib\net40\System.Web.WebPages.Razor.dll
    
    更新参考
    
    真的
    ..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll
    
    您还应该查看
    web.config
    /Views/web.config
    文件,以确保它们没有引用此程序集的任何旧版本

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


    您可能还想签出。

    看起来DLL存储在中。将GAC中的程序集更新为新的程序集。它不是CsProjs,但在过去某个时候有一些很小的web.cofig显然是由一个工具添加的,它们引用了1.0.0.0,将它们全部更新为3,现在可以工作了。谢谢谢谢,虽然看起来你的问题在别处。很高兴你把它修好了:-)
    <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>