如何在MSBuild中获取自定义重命名的$(Platform)值?
这个问题我之前也碰到过,本质是MSBuild在解决方案和项目层面的平台属性映射逻辑导致的:当你在解决方案里把标准平台(比如x86)重命名为MyPlatform1,然后用MSBuild myApp.sln -p:Platform=MyPlatform1构建时,MSBuild会自动将解决方案级的自定义平台名称映射到项目实际使用的标准平台(也就是你看到的x86),所以$(Platform)返回的是项目级的目标平台,而非你传入的自定义名称。
下面给你两个可行的解决办法:
方法1:用$(PlatformName)获取解决方案级自定义平台名
MSBuild在处理解决方案构建时,会自动维护一个$(PlatformName)属性,它专门用来存储你指定的解决方案级平台名称(也就是MyPlatform1),而$(Platform)对应的是项目实际编译用的标准平台(比如x86)。你只需要把项目里的判断条件换成$(PlatformName)就行:
修改后的项目代码:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.2</TargetFramework> <LangVersion>preview</LangVersion> <Platforms>AnyCPU;x86;x64</Platforms> </PropertyGroup> <ItemGroup> <Compile Remove="ERROR.cs" Condition=" '$(PlatformName)' == 'MyPlatform1' " /> </ItemGroup> </Project>
现在再执行MSBuild myApp.sln -p:Platform=MyPlatform1,条件判断就能精准匹配你的自定义平台名称了。
方法2:显式传递自定义属性(更灵活)
如果你不想依赖解决方案的平台配置逻辑,也可以直接在命令行传递一个自定义属性,完全绕开MSBuild的默认映射:
MSBuild myApp.sln -p:Platform=x86 -p:CustomPlatform=MyPlatform1
然后在项目文件里用这个自定义属性做判断:
<Compile Remove="ERROR.cs" Condition=" '$(CustomPlatform)' == 'MyPlatform1' " />
这种方式的好处是逻辑更直白,不需要关心解决方案里的平台映射配置,适合复杂场景下的精准控制。
小提示
别忘了确认解决方案的平台映射是正确的:右键解决方案 → 属性 → 配置属性 → 配置管理器,检查MyPlatform1对应的项目平台是不是你期望的x86,这是确保属性传递正常的前提。
内容的提问来源于stack exchange,提问作者joe

