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
相关产品推荐
相关产品推荐

