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

时间:2008-09-27 01:27:42

标签: visual-studio visual-studio-2008 visual-studio-2005

我似乎无法找到Microsoft提供的任何有用的文档,说明在定义时如何使用Delimiter元素中的InheritsFromParentUserMacro属性用户Visual Studio中.vsprops属性表文件中的宏。

以下是示例用法:

<UserMacro Name="INCLUDEPATH" Value="$(VCROOT)\Inc"
    InheritsFromParent="TRUE" Delimiter=";"/>

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

注意:InheritedPropertySheets元素的VisualStudioPropertySheet属性相同,例如:

<VisualStudioPropertySheet ... InheritedPropertySheets=".\my.vsprops">

在这种情况下,“inherit”基本上意味着“include”

3 个答案:

答案 0 :(得分:9)

[回答我自己的问题]

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

  • 项目p.vcproj使用d.vsprops标记包含属性表文件InheritedPropertySheets派生的'd')。
  • d.vsprops包含属性表文件b.vsprops base 的'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"/>
...

<强> 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"/>
...

<强> p.vcproj

...
<Configuration ... InheritedPropertySheets=".\d.vsprops">
<Tool Name="VCPreBuildEventTool" CommandLine="set | sort"/>
...

构建输出

...
ENV=B
OVERRIDE=D
PREPEND=D+B
...

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

  1. PerformEnvironmentSet="true"是在用于构建事件的环境中定义用户宏所必需的。证明:NOENV未在构建输出中显示。
  2. 用户宏 始终 继承自包含的属性表,无论PerformEnvironmentSet还是InheritsFromParent。证明:在b.vsprops中,NOENV未在环境中设置,在d.vsprops中使用它而不需要InheritsFromParent
  3. 简单重新定义用户宏 会覆盖 以前的任何定义。证明:OVERRIDE设置为D,但之前已定义为B
  4. 使用InheritsFromParent="true" 重新定义用户宏 将新定义添加到之前的任何定义中,并由指定的Delimiter分隔。证明:PREPEND设置为D+B(不是DB+D。)
  5. 以下是我发现的一些其他资源,用于解释Visual Studio .vsprops文件和相关主题,这些资源来自几年前,但它仍然有用:

    understanding the VC project system part I: files and tools

    understanding the VC project system part II: configurations and the project property pages dialog

    understanding the VC project system part III: macros, environment variables and sharing

    understanding the VC project system part IV: properties and property inheritance

    understanding the VC project system part V: building, tools and dependencies

    understanding the VC project system part VI: custom build steps and build events

    understanding the VC project system part VII: "makefile" projects and (re-)using environments

答案 1 :(得分:0)

有关此here的UI版本的文档。 很多XML文件似乎都没有记录,通常只给出schema file。你对它们如何运作的猜测是非常正确的。

答案 2 :(得分:0)

这不是全部故事。

  • 分隔符不是继承的。只要 它们分隔的项目列表是继承的:相同的用户宏可以在不同的属性表中具有不同的分隔符,但只使用最后遇到的分隔符。 (我写的是“上次遇到的”,因为在项目级别,我们无法指定分隔符以及使用的内容是指定该宏的继承的最后一个属性表)
  • 分隔符只有在制作时才有效 单个字符。分隔符更长 超过一个角色可能有它 第一个和/或最后一个字符被剥离 在某些情况下,误入歧途 “加入”价值清单。
  • $(Inherit)似乎在里面工作 用户宏。像聚合一样 属性,它作为占位符 父级的值,它可以多次出现。如果没有找到$(Inherit),如果设置了继承标志,则隐含在开头。
  • $(NoInherit)似乎也可以在用户的​​宏中工作(使VC的行为就像未选中复选框一样)。
  • 出现用户宏(以及一些内置插件) 在用于构造属性表的路径时工作(VC自己的项目转换器使用该功能)。价值 用户的宏在这种情况下采取的不是 但总是很直观,特别是如果它在其他包含的属性表中重新定义。
  • 通常,“继承”或连接的是公式而不是值(即,您不能使用用户宏在属性表中拍摄(例如)$(IntDir)的本地值,并希望“通过继承冒泡“那个值,因为继承的东西实际上是公式”$(IntDir)“,其值最终将在项目/配置/文件级别解析。”
  • 忽略已加载的属性表(似乎避免相同的属性表将其用户宏聚合两次)
  • “/”和“\”似乎都适用 属性表路径(在大多数情况下 VS期望路径的地方。)
  • 以。开头的属性表路径 “/”(在宏已经解析之后)被假定为“./”,其中“。”是的位置 呼叫表/项目)。如果路径不以“./”,“../”或“drive:/”(关于UNC的dunno)开头,则相同。