有很多方法可以做到这一点。 “MSBuild Trickery”一书(技巧 #19、#80、#104)的十几页内容对所有这些都进行了详尽的解释,但我将在这里总结基本机制。
#80。定义您自己的解决方案机制
#19。考虑使用标准扩展路径
这些技巧讨论了 AdditionalProperties 元数据。为您的项目创建一个项目数组,并为 Platform 属性指定 AdditionalProperties 元数据,这些元数据将在使用 MSBuild 任务构建项目时使用。
在构建的属性文件中...
<ItemGroup>
<Project Include="./Folder1/Project1.csproj" />
<Project Include="./Folder2/Project2.vcxproj" />
...
</ItemGroup>
在构建目标中...
<ItemGroup>
<Project>
<AdditionalProperties
Condition="'%(Extension)' == '.csproj'">
>Platform=AnyCPU</AdditionalProperties>
<AdditionalProperties
Condition="'%(Extension)' == '.vcxproj'">
>Platform=Win32</AdditionalProperties>
<Project>
</ItemGroup>
<MSBuild Projects=@(Project) ... />
除此之外,您还可以添加 32 位和 64 位的检测。
#104。如何为多种项目类型统一平台
在一个通用的导入属性文件中,声明您自己的 $(__Platform) 属性,该属性派生自 $(Platform) 的值,类似于上述,它创建了一个“标准化”的“平台”概念以在项目的其余部分。这也适用于解决方案构建。
<PropertyGroup>
<__Platform
Condition="'$(Platform)' == 'Win32'>Win32</__Platform>
<__Platform
Condition="'$(Platform)' == 'Win64'>Win64</__Platform>
<__Platform
Condition="'$(Platform)' == 'x32'>Win32</__Platform>
<__Platform
Condition="'$(Platform)' == 'x64'>Win64</__Platform>
</PropertyGroup>
<PropertyGroup
Condition="'$(Platform)' == 'AnyCPU'">
<__Platform
Condition="'$(PROCESSOR_ARCHITECTURE)' == 'x86'>Win32</__Platform>
...etc...
</PropertyGroup>
...然后稍后,对于不同的项目文件类型,使用此值进行自定义导入...
<!-- for C# projects -->
<PropertyGroup>
<OutputPath>bin\$(__Platform).$(Configuration)\</OutputPath>
<IntermediateOutputPath>obj\$(__Platform)...
<!-- for C++ projects -->
<PropertyGroup>
<OutDir>bin\$(__Platform).$(Configuration)\</OutDir>
<IntDir>obj\$(__Platform)...