我有一个包含几百个C ++和C#项目的解决方案。我无法使用MSBuild直接构建具有不同类型的项目依赖项的任何单个项目,因为有效配置(Deubg / Release)和平台(Win32 / AnyCPU / x64)设置对于不同的项目类型是不同的。
例如,如果我有一个C ++项目“CppProj1”依赖于C#项目“CsharpProj1”,我无法通过在命令行上指定 Release / AnyCPU 来编译CppProj1和MSBuild,因为CppProj1将无法在未知平台类型上编译。同样,指定 Release / Win32 将导致CsharpProj1无法编译。 Visual Studio通过在每个解决方案文件中存储配置/平台设置的映射来解决此问题,但使用MSBuild的一个巨大动机是将我的构建过程与Visual Studio IDE分离。有没有办法在不使用VS解决方案文件的情况下处理这个问题?
答案 0 :(得分:3)
有很多方法可以做到这一点。 “MSBuild Trickery”(技巧#19,#80,#104)中的十几页对所有这些内容进行了详尽的解释,但我将总结这里的基本机制。
这些技巧讨论了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位的检测。
在一个公共导入的属性文件中,声明你自己的$(__ 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)...
答案 1 :(得分:0)
C ++ Build目标接受Win32
和x64
($(Platform)
属性的值)。
如果不需要AnyCPU
,也没关系。
我为两个项目尝试了这个:C#项目通过<ProjectReference>
依赖于C ++项目。
对于C ++,我使用以下include:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Targets" />
对于C#,我使用以下内容:
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
由于Microsoft.CSharp.targets
使用$(PlatformTarget)
为编译器指定平台,因此可以为C#项目指定以下属性:
<PropertyGroup>
<PlatformTarget Condition="'$(Platform)' == 'Win32'">x86</PlatformTarget>
<PlatformTarget Condition="'$(Platform)' == 'x64'">x64</PlatformTarget>
</PropertyGroup>
这是将正确的参数传递给命令行编译器。有关详细信息,请参阅/platform (C# Compiler Options)。
事实上,对于C ++和C#解决方案,$(Platform)
属性的这种方式可以与值Win32
或x64