我有一个游戏可执行文件使用的“引擎”库。该引擎库也由编辑器可执行文件使用。
我想为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中获得相同的效果
答案 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>