是否可以通过字符串名称动态获取MSBuild属性?
实现方法
你可以通过MSBuild内置的能力直接实现动态读取属性,不需要手动处理转义逻辑。
方案1:高版本MSBuild推荐方案(MSBuild 16.0+ / VS2019+)
直接使用[MSBuild]::GetValue()静态方法,第一个参数传入属性名字符串,第二个参数是属性不存在时的默认返回值,示例代码如下:
<Target Name="OutputBuildMacro"> <PropertyGroup> <PropertyToGet>MSBuildProjectFile</PropertyToGet> <MacroValue>$([MSBuild]::GetValue($(PropertyToGet), '未找到对应属性'))</MacroValue> </PropertyGroup> <Message Text="$(MacroValue)" /> </Target>
执行命令msbuild TestProject.vcxproj -t:OutputBuildMacro后,会直接输出项目文件名的实际值,而非$(MSBuildProjectFile)字面量。
原写法不生效的原因
MSBuild的属性展开是在代码解析阶段完成的,你手动拼接出来的$(属性名)字符串即使经过转义/解转义处理,也不会触发二次解析,所以只会输出拼接后的字面量,不会被识别为属性引用求值。
方案2:兼容低版本MSBuild的方案
如果需要兼容MSBuild 16.0以下版本,可以通过ItemGroup元数据中转实现:
<Target Name="OutputBuildMacro"> <PropertyGroup> <PropertyToGet>MSBuildProjectFile</PropertyToGet> </PropertyGroup> <ItemGroup> <TempItem Include="Temp"> <%(PropertyToGet)>placeholder</%(PropertyToGet)> </TempItem> </ItemGroup> <Message Text="@(TempItem->Metadata($(PropertyToGet)))" /> </Target>
该方案利用MSBuild元数据的动态求值特性,在所有支持元数据的MSBuild版本中都能正常运行。
内容的提问来源于stack exchange,提问作者Tomáš Zato
相关产品推荐
相关产品推荐

