ASP.NET MVC5项目加载Microsoft.CodeDom程序集失败,求解决方案
这个错误是典型的程序集版本不匹配问题——从日志里的WRN: 比较程序集名称导致不匹配: 内部版本号就能看出来,项目引用的版本(1.0.8.0)和实际找到的程序集版本不一致。下面是几个能快速解决问题的步骤:
1. 重新安装NuGet包(最常用的解决方法)
这个程序集是通过NuGet包Microsoft.CodeDom.Providers.DotNetCompilerPlatform安装的,大概率是包安装损坏或者版本冲突导致的问题。你可以打开Visual Studio的「NuGet包管理器控制台」,执行以下命令:
Update-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Reinstall
或者在「NuGet包管理器」界面里找到这个包,先卸载再重新安装——这样会自动同步web.config配置和bin目录里的程序集版本。
2. 检查并修正web.config的绑定重定向
打开项目的web.config,找到<runtime>节点下的<assemblyBinding>配置,确认是否有针对该程序集的绑定重定向。如果有,要保证newVersion的值和你实际安装的NuGet包版本一致。示例配置如下:
<dependentAssembly> <assemblyIdentity name="Microsoft.CodeDom.Providers.DotNetCompilerPlatform" publicKeyToken="31bf3856ad364e35" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.0.8.0" newVersion="1.0.8.0" /> </dependentAssembly>
同时别忘了检查<system.codedom>下的<compilers>节点,确保CodeDom提供者的版本和引用一致:
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701" />
3. 清理项目缓存并重建
- 右键项目,选择「清理」,清除旧的编译残留文件
- 手动删除项目根目录下的
bin和obj文件夹,彻底移除旧的程序集 - 重新生成项目,确保编译后
bin目录里的Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll版本和web.config里的引用完全匹配
4. 删除IIS Express临时缓存文件
错误日志显示程序集探测到了临时ASP.NET文件目录,这些缓存的旧文件很可能是版本冲突的“元凶”。你可以手动删除以下路径下的对应文件夹:
C:\Users\{name}\AppData\Local\Temp\Temporary ASP.NET Files\vs\b2d7334d\e3876cf7
删除后重启IIS Express,再尝试运行项目。
5. 确认项目目标.NET Framework版本
ASP.NET MVC5要求至少.NET Framework 4.5,右键项目→属性→应用程序,确认目标框架是正确的版本,并且你的机器上已经安装了对应的.NET Framework环境。
附:你提供的错误信息
无法加载文件或程序集“Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或其依赖项之一。找到的程序集清单定义与程序集引用不匹配。(来自HRESULT的异常: 0x80131040)
=== 预绑定状态信息 ===
LOG: DisplayName = Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (完全指定)
LOG: Appbase = file:///C:/Users/{name}/Documents/git/Project/
LOG: Initial PrivatePath = C:\Users{name}\Documents\git\Project\bin
调用程序集: (未知)LOG: 此绑定在默认加载上下文中启动。
LOG: 使用应用程序配置文件: C:\Users{name}\Documents\git\Project\web.config
LOG: 使用宿主配置文件: C:\Users{name}\Documents\IISExpress\config\aspnet.config
LOG: 使用计算机配置文件来自 C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: 策略后引用: Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: 尝试下载新的URL file:///C:/Users/{name}/AppData/Local/Temp/Temporary ASP.NET Files/vs/b2d7334d/e3876cf7/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.DLL.
LOG: 尝试下载新的URL file:///C:/Users/{name}/AppData/Local/Temp/Temporary ASP.NET Files/vs/b2d7334d/e3876cf7/Microsoft.CodeDom.Providers.DotNetCompilerPlatform/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.DLL.
LOG: 尝试下载新的URL file:///C:/Users/{name}/Documents/git/Project/bin/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.DLL.
WRN: 比较程序集名称导致不匹配: 内部版本号
ERR: 未能完成程序集的安装(hr = 0x80131040)。探测终止。
内容的提问来源于stack exchange,提问作者Teije

