.vsprops文件中的'Delimiter'和'InheritsFromParent'属性是什么意思?
在Microsoft为Visual Studio的.vsprops属性表文件中定义用户宏时,我似乎找不到Microsoft的任何有用文档来说明如何在UserMacro元素中使用Delimiter和InheritsFromParent属性。
这是示例用法:
<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc" InheritsFromParent="TRUE" Delimiter=";"/>
从上面的示例中,我猜测"继承"的真正含义是" a)如果定义为非空,则追加定界符,b)追加新定义",其中非继承行为将是简单地替换任何当前宏定义。有人有确切消息么?更好的是,是否有人对Visual Studio.vsprops
文件和宏有任何替代文档的建议来源?
注意:这与VisualStudioPropertySheet元素的InheritedPropertySheets属性不同,例如:
<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops">
在这种情况下,"继承"基本上是指"包含"。
解决方案
这里有关于UI版本的文档。
许多XML文件似乎没有文档说明,通常只是提供一个架构文件。我们对它们如何起作用的猜测几乎是正确的。
[回答我自己的问题]
InheritsFromParent
表示前置。为了验证这一点,我做了一个实验,揭示了用户宏在Visual Studio 2008中的工作方式。这是设置:
- 项目" p.vcproj"包含使用" InheritedPropertySheets"标记的属性表文件" d.vsprops"(" d"表示派生)。
- d.vsprops包含属性表文件b.vsprops(基数为b)。
- p.vcproj还定义了一个预构建事件,该事件转储环境。
- 两个
.vsprops
文件都包含用户宏定义。
道具
... <UserMacro Name="NOENV" Value="B"/> <UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/> <UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/> ...
道具
... <VisualStudioPropertySheet ... InheritedPropertySheets=".\b.vsprops"> <UserMacro Name="ENV" Value="$(NOENV)" PerformEnvironmentSet="true"/> <UserMacro Name="OVERRIDE" Value="D" PerformEnvironmentSet="true"/> <UserMacro Name="PREPEND" Value="D" InheritsFromParent="true" Delimiter="+" PerformEnvironmentSet="true"/> ...
p.vcproj
... <Configuration ... InheritedPropertySheets=".\d.vsprops"> <Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/> ...
建立输出
... ENV=B OVERRIDE=D PREPEND=D+B ...
从这些结果,我们可以得出以下结论:
- 要在用于构建事件的环境中定义用户宏,必须使用PerformEnvironmentSet =" true"。证明:
NOENV
未在构建输出中显示。 - 无论" PerformEnvironmentSet"还是" InheritsFromParent",用户宏总是从包含的属性表中继承而来。证明:在b.vsprops中,没有在环境中设置NOENV,而在d.vsprops中,则不需要InheritsFromParent。
- 用户宏的简单重新定义将覆盖任何先前的定义。证明:尽管" OVERRIDE"已被设置为" D",但先前已将其定义为" B"。
- 使用
InheritsFromParent =" true"
重新定义用户宏会将新定义添加到任何先前的定义之前,并以指定的'Delimiter'分隔。证明:" PREPEND"设置为" D + B"(不是" D"或者" B + D"。)
这是我发现的一些其他资源,可用于解释Visual Studio.vsprops
文件和相关主题,虽然有几年的历史了,但仍然很有帮助:
了解VC项目系统的第一部分:文件和工具
了解VC项目系统第二部分:配置和项目属性页面对话框
理解VC项目系统的第三部分:宏,环境变量和共享
了解VC项目系统的第四部分:属性和属性继承
理解VC项目系统的第五部分:构建,工具和依赖项
了解VC项目系统的第六部分:自定义构建步骤和构建事件
了解VC项目系统的第七部分:" makefile"项目和(重用)环境