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

Dan*_*ann 5 msbuild visual-studio

我有一个包含数百个C ++和C#项目的解决方案。我不能使用MSBuild直接构建具有不同类型项目依赖项的任何单个项目,因为有效配置(Deubg / Release)和平台(Win32 / AnyCPU / x64)设置对于不同项目类型是不同的。

例如,如果我有一个C ++项目“ CppProj1”依赖于C#项目“ CsharpProj1”,则我无法通过在命令行上指定Release / AnyCPU来使用MSBuild编译CppProj1,因为CppProj1无法在未知平台类型上进行编译。同样,指定Release / Win32将导致CsharpProj1编译失败。Visual Studio通过在每个解决方案文件中存储配置/平台设置的映射来解决此问题,但是使用MSBuild的巨大动机是将构建过程与Visual Studio IDE分离。有没有不使用VS解决方案文件就可以解决此问题的方法?

Bri*_*ler 4

有很多方法可以做到这一点。“MSBuild Trickery”(技巧#19、#80、#104)一书中的十几页内容涵盖了所有这些内容的彻底解释,但我将在这里总结基本机制。

#80。定义您自己的解决方案机制

#19。考虑使用标准扩展路径

这些技巧对AdditionalProperties 元数据进行了讨论。为项目创建项目数组,并为 Platform 属性指定AdditionalProperties 元数据,该元数据将在使用 MSBuild 任务生成项目时使用。

在您的构建的属性文件中...

<ItemGroup>
   <Project Include="./Folder1/Project1.csproj" />
   <Project Include="./Folder2/Project2.vcxproj" />
   ...
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

在构建目标中...

<ItemGroup>
   <Project>
      <AdditionalProperties
         Condition="'%(Extension)' == '.csproj'">
         >Platform=AnyCPU</AdditionalProperties>
      <AdditionalProperties
         Condition="'%(Extension)' == '.vcxproj'">
         >Platform=Win32</AdditionalProperties>
   <Project>
</ItemGroup>

<MSBuild Projects=@(Project) ... />
Run Code Online (Sandbox Code Playgroud)

除此之外,您还可以添加 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>
Run Code Online (Sandbox Code Playgroud)

...然后,对于不同的项目文件类型,进行使用该值的自定义导入...

<!-- for C# projects -->
<PropertyGroup>
   <OutputPath>bin\$(__Platform).$(Configuration)\</OutputPath>
   <IntermediateOutputPath>obj\$(__Platform)...

<!-- for C++ projects -->
<PropertyGroup>
   <OutDir>bin\$(__Platform).$(Configuration)\</OutDir>
   <IntDir>obj\$(__Platform)...
Run Code Online (Sandbox Code Playgroud)