具有本机和托管项目引用的项目的MSBuild

时间:2011-10-07 23:54:52

标签: visual-studio msbuild

我有一个包含几百个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解决方案文件的情况下处理这个问题?

2 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点。 “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)...

答案 1 :(得分:0)

C ++ Build目标接受Win32x64$(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)属性的这种方式可以与值Win32x64

一起使用