'Delimiter'和'InheritsFromParent'属性在.vsprops文件中的含义是什么?

jwf*_*arn 7 visual-studio-2005 visual-studio-2008 visual-studio

我似乎无法找到任何有用的微软大约将如何使用的文档DelimiterInheritsFromParent属性的UserMacro定义用户宏当元素.vsprops属性表文件为Visual Studio.

以下是示例用法:

<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc"
    InheritsFromParent="TRUE" Delimiter=";"/>
Run Code Online (Sandbox Code Playgroud)

从上面的例子中,我猜测"inherit"实际上意味着"a)如果定义是非空的,那么追加分隔符,b)附加新定义"其中非继承行为将简单地替换任何当前宏定义.有人有确切消息么?更好的是,有没有人有Visual Studio .vsprops文件和宏的替代文档的任何建议来源?

注意:这是一样的InheritedPropertySheets所述的属性VisualStudioPropertySheet元件,例如:

<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops">
Run Code Online (Sandbox Code Playgroud)

在这种情况下,"继承"基本上意味着"包括".

jwf*_*arn 9

[回答我自己的问题]

InheritsFromParent意思是前置.为了验证这一点,我做了一个实验,揭示了用户宏在Visual Studio 2008中的工作方式.以下是设置:

  • Project 使用标记p.vcproj包含属性表文件d.vsprops(派生的 'd' )InheritedPropertySheets.
  • d.vsprops包括属性表文件b.vsprops('b'表示基础.)
  • p.vcproj 还定义了一个转储环境的预构建事件.
  • 这两个.vsprops文件都包含用户宏定义.

b.vsprops

...
<UserMacro Name="NOENV" Value="B"/>
<UserMacro Name="OVERRIDE" Value="B" PerformEnvironmentSet="true"/>
<UserMacro Name="PREPEND" Value="B" PerformEnvironmentSet="true"/>
...
Run Code Online (Sandbox Code Playgroud)

d.vsprops

...
<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"/>
...
Run Code Online (Sandbox Code Playgroud)

p.vcproj

...
<Configuration ... InheritedPropertySheets=".\d.vsprops">
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/>
...
Run Code Online (Sandbox Code Playgroud)

构建输出

...
ENV=B
OVERRIDE=D
PREPEND=D+B
...
Run Code Online (Sandbox Code Playgroud)

从这些结果我们可以得出以下结论:

  1. PerformEnvironmentSet="true"必须在用于构建事件的环境中定义用户宏.证明:NOENV未在构建输出中显示.
  2. 用户宏都总是从包括属性表继承不管PerformEnvironmentSetInheritsFromParent.证明:in b.vsprops,NOENV未设置在环境中并且在d.vsprops不需要的情况下使用InheritsFromParent.
  3. 对用户宏的简单重新定义会覆盖以前的任何定义.证明:OVERRIDE设置为D尽管早先定义为B.
  4. 一个用户宏用的重新定义InheritsFromParent="true" 预规划的新定义之前的任一定义中,由指定的分开Delimiter.证明:PREPEND设置为D+B(不是DB+D.)

以下是我在解释Visual Studio .vsprops文件和相关主题时发现的一些额外资源,它来自几年前,但它仍然有用:

理解VC项目系统第一部分:文件和工具

了解VC项目系统第二部分:配置和项目属性页面对话框

理解VC项目系统第三部分:宏,环境变量和共享

理解VC项目系统第四部分:属性和属性继承

理解VC项目系统第五部分:构建,工具和依赖

了解VC项目系统第六部分:自定义构建步骤和构建事件

了解VC项目系统第七部分:"makefile"项目和(重新)使用环境