Msbuild预处理器定义主exe项目的所有依赖项

本文关键字:依赖 项目 exe 预处理 处理器 定义 Msbuild | 更新日期: 2023-09-27 18:03:27

我有一个游戏可执行文件使用的"引擎"库。该引擎库也被编辑器可执行文件使用。

我想用预处理器常数EDITOR构建引擎库,当它为editor.exe构建时当为游戏构建引擎库时,没有"EDITOR"预处理器常量。

是否有一种方法可以说明引用项目中的预处理器常量也应该用于依赖构建?

我已经在编辑器.csproj中尝试过了:

<Project ToolsVersion="4.0" DefaultTargets="Build">
  <PropertyGroup>
    <AssemblyName>MyEditor</AssemblyName>
    <DefineConstants>EDITOR</DefineConstants>
  ...

,但这只适用于MyEditor.exe程序集。我希望它也适用于所有引用

我希望这足够清楚:)

编辑:我可以从msbuild MyEditor.csproj /p:DefineConstants=EDITOR命令行得到这个工作,但我不知道如何在Visual Studio

Msbuild预处理器定义主exe项目的所有依赖项

中获得相同的效果

这是可能的,但需要一点MSBuild技巧。构建引用项目的方式是,通过Microsoft.Common.targets文件中的操作,它们最终出现在@(ProjectReferenceWithConfiguration)项数组中。现在,如果项目像这样包含在这个项目数组中,在一个项目中,而不在另一个项目中,

<!-- pseudo-code for what Microsoft.Common.targets creates -->
<ItemGroup>
   <ProjectReferenceWithConfiguration Include="ReferencedProject.csproj">
      <AdditionalProperties>DefineConstants=EDITOR</AdditionalProperties>
   </ProjectReferenceWithConfiguration>
</ItemGroup>

…它会按照你想要的方式建造。你是如何设置的呢?那么,您可以使用您自己的自定义目标连接到@(ProjectReferenceWithConfiguration)项数组的创建中,并添加AdditionalProperties元数据值。像这样…

<!-- inside referencing project -->
<Target Name="AddEditorConstant"
   AfterTargets="AssignProjectConfiguration"
   BeforeTargets="_SplitProjectReferencesByFileExistence">
   <ItemGroup>
      <ProjectReferenceWithConfiguration
         Condition="'%(Identity)' == 'ReferencedProject.csproj'>
         <AdditionalProperties>DefineConstants=EDITOR</AdditionalProperties>
      </ProjectReferenceWithConfiguration>
   </ItemGroup>
</Target>

(注意,我并没有实际运行这个,可能需要一些实验)

对于反转自定义位置的更通用的解决方案,将其放置在引用项目中而不是引用中,您可以将带有引用的父项目作为自定义属性注入到所有引用中,

<!-- somewhere common to all projects -->
<Target Name="InjectReferencingProject"
   AfterTargets="AssignProjectConfiguration"
   BeforeTargets="_SplitProjectReferencesByFileExistence">
   <ItemGroup>
      <ProjectReferenceWithConfiguration>
         <AdditionalProperties>ReferencingProject=$(MSBuildProjectFile)</AdditionalProperties>
      </ProjectReferenceWithConfiguration>
   </ItemGroup>
</Target>

然后,在ReferencedProject中。根据父项目的引用

,修改您想要的任何内容。
<!-- inside referenced project -->
<PropertyGroup>
   <DefineConstants>default-constants</DefineConstants>
   <DefineConstants
      Condition="'$(ReferencingProject)' == 'SomeSpecialProject.csproj'"
      >$(DefineConstants);EDITOR</DefineConstants>
</PropertyGroup>