部署时Microsoft.Net.Compilers包报错问题求助
嘿,我碰到过类似的坑,来帮你一步步搞定这个问题!
首先得搞清楚:Microsoft.Net.Compilers这个包是用来让服务器使用指定版本的Roslyn编译器编译你的C#/VB代码和视图的。你遇到的问题核心就是服务器没正确加载新版本的编译器——要么配置错了,要么关键文件没传上去,要么环境不兼容。
可能的原因&解决步骤
1. 先确保NuGet包安装正确,别手动瞎改版本号
很多人犯的错就是手动改web.config里的版本号,结果和实际安装的包不匹配。正确的做法是:
- 打开NuGet包管理器控制台,执行以下命令彻底清理旧包再重装:
Uninstall-Package Microsoft.Net.Compilers -Force Uninstall-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform -Force Install-Package Microsoft.Net.Compilers -Version 2.6.1
这会自动安装和2.6.1版本编译器配套的Microsoft.CodeDom.Providers.DotNetCompilerPlatform包,并且自动更新web.config里的配置,不用你手动改!
2. 部署时一定要带上roslyn文件夹
这是最容易漏掉的点!安装完Microsoft.Net.Compilers后,项目的bin目录下会生成一个roslyn文件夹,里面包含csc.exe、vbc.exe等编译器核心文件。部署到服务器时,必须把这个整个文件夹上传到服务器的bin目录里——没有它,服务器找不到新版本的编译器,自然会报错。
3. 检查web.config的system.codedom配置是否正确
重装包后,NuGet自动生成的配置应该类似这样(注意版本号是CodeDom包的版本,不是编译器的2.6.1!):
<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:7 /nowarn:1659;1699;1701"/> <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:default /nowarn:41008 /define:_MYTYPE=\"Web\" /optionInfer+"/> </compilers> </system.codedom>
如果你之前手动改了版本号,把它改回NuGet生成的版本就行。
4. 确认服务器的.NET Framework版本达标
Microsoft.Net.Compilers 2.6.1需要**.NET Framework 4.6或更高版本**支持。如果服务器还在用4.5或更低版本,肯定会出现兼容性问题。去服务器的“程序和功能”里看看已安装的.NET Framework版本,不够的话就去微软官网下载安装对应版本。
5. 关于移除配置后页面崩溃的原因
移除web.config里的编译器配置后,服务器会用系统自带的旧版本编译器(比如.NET Framework 4.5自带的Roslyn版本),而你的新代码里大概率用了旧编译器不支持的语法(比如C# 7.0的元组、模式匹配等特性),所以新页面会崩溃。这也反过来证明你必须让服务器使用新版本的编译器才能正常运行新代码。
最后检查
部署完成后,重启一下IIS应用程序池,确保配置生效。如果还是有报错,把具体的错误日志贴出来,我再帮你排查!
内容的提问来源于stack exchange,提问作者Bad Dub

