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

时间:2011-07-26 14:57:17

标签: c# visual-studio-2010 msbuild

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

我想为editor.exe构建一个带有预处理器常量EDITOR的引擎库 当为游戏构建引擎库时,没有“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中获得相同的效果

1 个答案:

答案 0 :(得分:1)

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

<!-- 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.csproj中,根据哪个父项目有引用修改你想要的任何内容,

<!-- inside referenced project -->
<PropertyGroup>
   <DefineConstants>default-constants</DefineConstants>
   <DefineConstants
      Condition="'$(ReferencingProject)' == 'SomeSpecialProject.csproj'"
      >$(DefineConstants);EDITOR</DefineConstants>
</PropertyGroup>