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

我将我的项目从MVC 4转换到MVC 5(和.Net 4到.Net 4.5.2,这是变化的真正的驱动程序)。

当我运行我的一个页面时,出现这个错误(为了方便阅读,我添加了空格)

[A] System.Web.WebPages.Razor.Configuration.HostSection不能转换为[B] System.Web.WebPages.Razor.Configuration.HostSection。

typesA来源于'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”。

typesB来自位于“C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319”上下文“默认”中的“System.Web.WebPages.Razor,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35” \ 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版本。

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

清理重build,仍然有问题。 我回去,手动检查每个版本的System.Web.WebPages.Razor.dll,在每个项目的参考引用它。 我检查我的文件夹,我复制dll手动引用它们,它不在那里。

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

文件\ studentportal3g …

旧的坏的dll从哪里来? 我该如何解决这个错误? 我如何防止它再次发生?

谢谢,

Eric-

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

问题不在于您的文件存在于GAC中,或者NuGet尚未安装它,问题很可能是您的某个项目文件仍旧引用旧版本的System.Web.WebPages.Razor版本1.0.0.0 ,你需要find所有对它的引用,并相应地改为3.0.0.0

  1. 在解决scheme资源pipe理器中右键单击您的项目节点,然后单击Unload Project
  2. 再次右键单击项目节点,然后单击Edit <projectName>.csproj
  3. 在文件中search对System.Web.WebPages.Razor引用,并相应地更新版本和HintPath (如下所示)。 确保您使用的HintPath实际上指向一个现有的文件。
  4. 对解决scheme中的所有依赖项目(以及不属于解决scheme的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文件,以确保它们不引用此程序集的任何旧版本。

注:如果上述说明不能解决您的问题,则可能是您的解决scheme之外的问题。 很可能有一个第三方库在某处引用旧版本的文件。 如果是这样,您可以尝试获取DLL的更新版本。

你可能也想看看这个问题 。

它看起来像旧的DLL在全局程序集caching(GAC)中。 GAC是您可以存储可从机器上的多个应用程序引用的程序集的地方。 点击这里阅读更多关于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