VS2017中使用Microsoft.Build.Evaluation引发项目文件导入错误
这个问题我之前帮不少开发者排查过,本质是VS2017的MSBuild依赖布局、版本适配逻辑和VS2015有差异,给你几个针对性的解决方案:
先检查VS2017的工作负载是否完整
报错里的Microsoft.WebApplication.targets属于ASP.NET和Web开发工作负载的一部分,如果你的VS2017没装这个组件,自然找不到文件。打开VS安装器,选择“修改”当前的VS2017实例,确保勾选了ASP.NET和Web开发选项,然后完成安装更新。修正项目文件中的硬编码导入路径
很多从VS2015迁移过来的项目,会在.csproj文件里硬编码VS版本号(比如v15.0),导致在不同VS版本下无法适配。找到项目文件里类似这样的导入语句:<Import Project="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" />替换成动态获取路径的写法,让MSBuild自动适配当前环境:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets')" />这里的
$(MSBuildExtensionsPath32)和$(VisualStudioVersion)都是MSBuild内置的环境变量,会自动指向当前VS对应的路径和版本号。确保Microsoft.Build.Evaluation使用正确的MSBuild版本
VS2017的MSBuild是和VS实例绑定的,路径一般是C:\Program Files (x86)\Microsoft Visual Studio\2017\<你的VS版本,比如Enterprise>\MSBuild\15.0\Bin。如果你的代码是通过NuGet引用的Microsoft.Build包,可能版本不匹配,导致加载了错误的MSBuild上下文。你可以在初始化Project对象时手动指定环境变量,强制指向VS2017的MSBuild路径:var msBuildProps = new Dictionary<string, string> { { "MSBuildExtensionsPath32", @"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild" }, { "VisualStudioVersion", "15.0" } }; var targetProject = new Project(@"你的项目路径.csproj", msBuildProps, null);注意把路径里的
Enterprise换成你实际安装的VS版本(比如Community、Professional)。应急方案:手动补充targets文件(不推荐长期使用)
如果上面的方法都暂时无法操作,你可以从一台安装了完整VS2017 ASP.NET工作负载的机器上,复制Microsoft.WebApplication.targets文件到报错提示的路径(C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v15.0\WebApplications\),但这只是临时解决,后续还是建议用前面的方法从根源上修复。
内容的提问来源于stack exchange,提问作者boruchsiper

