C# 动态设置条件编译符号
我希望有一个条件编译符号列表,可能是一个表,其中每个符号都有一个复选框,然后在构建时,编译中只包含“打开”的符号。除了在编译之前,如何以编程方式更改项目文件,还有其他方法可以做到吗?首先,我假设对于这个答案,您希望从VisualStudioIDE中编译它,并编译一个C++项目。 可以通过向项目中添加属性页来完成此操作,在项目中指定所有这些编译符号。属性页为您提供的UI非常简单。用户编辑属性页时,数据存储在项目文件或用户文件中的项/属性上。 您还需要添加一个自定义任务,该任务将实际获取属性页存储的数据,并在编译文件时应用该数据 下面是更多细节:C# 动态设置条件编译符号,c#,visual-studio,visual-studio-2010,msbuild,C#,Visual Studio,Visual Studio 2010,Msbuild,我希望有一个条件编译符号列表,可能是一个表,其中每个符号都有一个复选框,然后在构建时,编译中只包含“打开”的符号。除了在编译之前,如何以编程方式更改项目文件,还有其他方法可以做到吗?首先,我假设对于这个答案,您希望从VisualStudioIDE中编译它,并编译一个C++项目。 可以通过向项目中添加属性页来完成此操作,在项目中指定所有这些编译符号。属性页为您提供的UI非常简单。用户编辑属性页时,数据存储在项目文件或用户文件中的项/属性上。 您还需要添加一个自定义任务,该任务将实际获取属性页存储的
- 从项目文件导入目标文件。编辑.vcxproj并在末尾(例如,在结束元素
之前)添加如下内容:
- 编写MyTargets.xml文件。它应该导入属性页并定义自定义目标
我的_符号;%(预定义)
AddMySymbols目标在编译每个文件之前执行。对于每个文件,如果名为“MY_SYMBOL”的属性为true,我们将MY_SYMBOL添加到预处理定义中
- 编写MyProperties.xml文件。Visual Studio使用此文件显示属性页UI。它将允许用户将MY_SYMBOL属性设置为true/false。 下面是MyProperties.xml的一个示例:
我的符号
ItemType为“”,因此MY_符号将作为属性而不是项保存在项目文件中。你可以用不同的方式来安排,而不是使用项目。
如果希望每个用户保存符号,可以将数据源更改为
这里是一个链接
Amir您想从VS构建还是调用MSBuild(通过命令行)?我正在编译一个C#项目,谢谢,这是一个很好的答案,应该可以让我开始。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<PropertyPageSchema Include="$(ProjectDir)MyProperties.xml"/>
</ItemGroup>
<Target Name="AddMySymbols"
Inputs="@ClCompile"
Outputs="__non_existent_outputs__"
BeforeTargets="ClCompile">
<ItemGroup>
<ClCompile Include="@ClCompile">
<PreprocessorDefinitions Condition="'$(MY_SYMBOL)'='true'">MY_SYMBOL; %(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
</ItemGroup>
</Target>
</Project>
<ProjectSchemaDefinitions xmlns="http://schemas.microsoft.com/build/2009/properties">
<Rule Name="Symbols" PageTemplate="tool" DisplayName="Symbols" SwitchPrefix="/" Order="1" xmlns="http://schemas.microsoft.com/build/2009/properties" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Rule.Categories>
<Category Name="MySymbols">
<Category.DisplayName>
<sys:String>My Symbols</sys:String>
</Category.DisplayName>
</Category>
</Rule.Categories>
<Rule.DataSource>
<DataSource Persistence="ProjectFile" ItemType="" HasConfigurationCondition="false" />
</Rule.DataSource>
<BoolProperty
Name="MY_SYMBOL"
Category="MySymbols"
DisplayName="MY_SYMBOL"
Description="When enabled, MY_SYMBOL will be added to preprocessor symbols when compiling C/C++ files."/>
</ProjectSchemaDefinitions>