Visual Studio 2017编译正常但MSBuild报MSB4062错误求助
解决命令行调用MSBuild编译ASP.NET Web应用程序的错误,以及说明
Volker你好,先给你解释
什么是声明?
return (<UsingTask>是MSBuild里的关键配置元素,简单说就是**给MSBuild指路的**——当你的项目用到了MSBuild自带任务之外的自定义构建任务(比如这里的`Microsoft.CodeAnalysis.BuildTasks.Csc`,也就是Roslyn编译器的编译任务),就需要通过<UsingTask>告诉MSBuild:这个任务对应的类在哪个程序集文件里,任务的类名是什么。这样MSBuild在执行构建流程时,才能找到并调用这个任务完成对应的操作。 ## 你的编译错误原因及解决步骤 从错误信息来看,核心问题是**你用的MSBuild版本太旧了**:错误里显示你调用的是`C:\Program Files (x86)\MSBuild\12.0\bin\msbuild.exe`(对应VS2013的MSBuild版本),但你的项目是在VS2017中开发的,依赖的是更高版本的MSBuild和Roslyn编译器组件,版本不匹配导致找不到`Microsoft.Build.Utilities.Core, Version=14.0.0.0`这个依赖。 按照下面的步骤来修复: - **使用VS2017对应的MSBuild版本** VS2017的MSBuild默认路径是(根据你的VS版本替换`<你的版本>`,比如Community/Professional/Enterprise): - 32位:`C:\Program Files (x86)\Microsoft Visual Studio\2017\<你的版本>\MSBuild\15.0\Bin\msbuild.exe` - 64位:`C:\Program Files (x86)\Microsoft Visual Studio\2017\<你的版本>\MSBuild\15.0\Bin\amd64\msbuild.exe` 直接在命令行调用这个路径下的msbuild,而不是旧版的12.0版本。 - **更简便的方式:使用VS开发者命令提示符** 打开开始菜单里Visual Studio 2017文件夹下的**开发者命令提示符**,这个工具会自动帮你配置好所有VS相关的环境变量,包括正确的MSBuild路径。打开后直接执行: ```bash msbuild C:\my\Sandboxes\2017\WebApplication\WebApplication.csproj ``` 就能正常编译了。 - **确保NuGet包完全恢复** 如果上面的步骤还不行,先在开发者命令提示符里执行NuGet恢复命令,确保所有依赖包都正确下载: ```bash nuget restore C:\my\Sandboxes\2017\你的解决方案文件名.sln ``` 恢复完成后再执行构建命令。 - **检查项目中的<UsingTask>配置(可选)** 打开你的`WebApplication.csproj`文件,找到关于`Microsoft.CodeAnalysis.BuildTasks.Csc`的<UsingTask>声明,它应该是NuGet自动生成的类似内容: ```xml <UsingTask TaskName="Microsoft.CodeAnalysis.BuildTasks.Csc" AssemblyFile="$(SolutionDir)\packages\Microsoft.Net.Compilers.2.6.1\tools\Microsoft.Build.Tasks.CodeAnalysis.dll" /> )
确保`AssemblyFile`的路径是正确的——如果你是单独编译项目而不是解决方案,可能需要把`$(SolutionDir)`改成`$(ProjectDir)\..`这样的相对路径,或者用绝对路径临时测试。 --- > 内容的提问来源于stack exchange,提问作者Volker




