Visual Studio 2017中ASP.NET Web API启动报错的永久解决方法咨询
彻底解决ASP.NET Framework Web API中Roslyn csc.exe缺失的问题
我之前帮不少开发者搞定过这个头疼的问题——每次重新打开解决方案或者清理构建后,就弹出找不到bin\roslyn\csc.exe的错误,手动跑Update-Package命令实在太麻烦。下面给你几个永久解决的办法,让包和依赖文件自动到位:
方法1:开启NuGet自动包恢复(基础必做)
首先确保Visual Studio会自动帮你补全缺失的NuGet包,这是解决问题的基础:
- 打开VS2017,点击顶部菜单的 Tools > Options > NuGet Package Manager > General
- 勾选这两个选项:
- Allow NuGet to download missing packages
- Automatically check for missing packages during build in Visual Studio
- 右键你的解决方案,选择 Restore NuGet Packages,等恢复完成后再构建项目。
这样设置后,下次打开解决方案或者清理bin/obj文件夹后,VS会自动拉取缺失的Microsoft.CodeDom.Providers.DotNetCompilerPlatform包,不用手动操作。
方法2:修改项目文件,强制构建时复制Roslyn文件(兜底方案)
如果自动包恢复后还是偶尔出现文件缺失,那是因为包的安装脚本有时候没把Roslyn文件正确复制到输出目录。我们可以给项目加一段MSBuild脚本,强制在构建前复制文件:
- 右键你的Web API项目,选择 Unload Project
- 右键已卸载的项目,选择 Edit [你的项目名].csproj
- 在项目文件的末尾(
</Project>标签之前)添加这段代码:
<Target Name="EnsureRoslynFiles" BeforeTargets="Build"> <ItemGroup> <RoslynFiles Include="$(SolutionDir)packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.*\tools\RoslynCompiler\**\*.*" /> </ItemGroup> <Copy SourceFiles="@(RoslynFiles)" DestinationFolder="$(OutputPath)roslyn\" SkipUnchangedFiles="true" /> </Target>
- 保存文件,右键项目选择 Reload Project,然后重新构建运行。
这段脚本会在每次构建前,自动从NuGet包的安装目录里把Roslyn的所有编译器文件复制到输出目录的roslyn文件夹,彻底杜绝文件缺失的问题。
方法3:替换为Legacy CodeDom提供者(备选,不推荐)
如果你的项目不需要使用最新的C#语言特性,可以考虑换成旧版的CodeDom提供者,完全绕过Roslyn依赖:
- 在程序包管理器控制台执行:
Uninstall-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform Install-Package Microsoft.CodeDom.Providers.DotNetCompilerPlatform.Legacy
这个包会使用系统自带的编译器,不会依赖本地的Roslyn文件,但缺点是没法用C#6及以后的新特性,所以只适合老项目。
验证方式
做完上述设置后,删除项目的bin和obj文件夹,重新打开解决方案,直接构建运行——这次应该不会再弹出找不到csc.exe的错误了,一切都会自动处理。
内容的提问来源于stack exchange,提问作者Henke
相关产品推荐
相关产品推荐

