You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2019加载vcxproj报错:<Choose>下的<When>元素未知,原因何在?

解决VS2019加载vcxproj时<When>元素未知的错误

错误原因

MSBuild的<Choose>元素不能直接作为<Target>的子元素,它仅允许放在项目根节点(<Project>)下,或者<PropertyGroup>、<ItemGroup>内部。你在<Rebuild> Target中直接嵌套<Choose>,违反了MSBuild的元素层级规则,导致VS2019加载项目时报错。

修复方案

方案1:为每个任务添加Condition属性

将条件直接附加到每个需要执行的任务上,当条件满足时才执行对应任务:

<Target Name="Rebuild" DependsOnTargets="Clean">
  <RemoveDir Directories="$(MSBuildProjectDirectory)\intermediate" Condition="'$(MSBuildProjectDirectory)'!=''" />
  <RemoveDir Directories="$(MSBuildProjectDirectory)\$(BaseIntermediateOutputPath)" Condition="'$(MSBuildProjectDirectory)'!=''" />
  <RemoveDir Directories="$(MSBuildProjectDirectory)\$(BaseOutputPath)" Condition="'$(MSBuildProjectDirectory)'!=''" />
  <Message Text="Artifact files have been deleted." Condition="'$(MSBuildProjectDirectory)'!=''" />
</Target>

方案2:使用MSBuild 16+支持的<If>元素(VS2019默认兼容)

如果需要将多个任务放在同一个条件块中,可以使用MSBuild 16.0及以上版本支持的<If>语法,简化代码结构:

<Target Name="Rebuild" DependsOnTargets="Clean">
  <If Condition="'$(MSBuildProjectDirectory)'!=''">
    <RemoveDir Directories="$(MSBuildProjectDirectory)\intermediate" />
    <RemoveDir Directories="$(MSBuildProjectDirectory)\$(BaseIntermediateOutputPath)" />
    <RemoveDir Directories="$(MSBuildProjectDirectory)\$(BaseOutputPath)" />
    <Message Text="Artifact files have been deleted." />
  </If>
</Target>

补充说明

<Choose>元素主要用于项目加载阶段的分支逻辑(比如根据不同配置导入不同的.props文件、设置不同的属性组),而Target内部的任务执行分支,应该使用任务的Condition属性或<If>/<Else>语法实现。

内容的提问来源于stack exchange,提问作者AxD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 10:16:22