奇怪的错误升级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
。
- 在解决scheme资源pipe理器中右键单击您的项目节点,然后单击
Unload Project
。 - 再次右键单击项目节点,然后单击
Edit <projectName>.csproj
。 - 在文件中search对
System.Web.WebPages.Razor
引用,并相应地更新版本和HintPath
(如下所示)。 确保您使用的HintPath
实际上指向一个现有的文件。 - 对解决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