【问题标题】:What do 'Delimiter' and 'InheritsFromParent' attributes mean in .vsprops files?.vsprops 文件中的 'Delimiter' 和 'InheritsFromParent' 属性是什么意思?
【发布时间】:2008-09-27 01:27:41
【问题描述】:

我似乎找不到任何来自 Microsoft 的有用文档,说明在.vsprops 中定义用户宏时如何使用UserMacro 元素中的DelimiterInheritsFromParent 属性Visual Studio 的属性表文件。

以下是示例用法:

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

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

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

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

在这种情况下,“继承”基本上意味着“包含”

【问题讨论】:

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


    【解决方案1】:

    [回答我自己的问题]

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

    • 项目p.vcproj 包含使用InheritedPropertySheets 标记的属性表文件d.vsprops(“d”表示派生)。
    • d.vsprops 包括属性表文件 b.vsprops('b' 代表 base。)
    • p.vcproj 还定义了转储环境的 Pre-Build Event。
    • .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. 无论PerformEnvironmentSetInheritsFromParent,用户宏总是从包含的属性表继承。证明:在b.vsprops中,环境中没有设置NOENV,在d.vsprops中使用不需要InheritsFromParent
    3. 用户宏的简单重新定义覆盖任何以前的定义。证明:OVERRIDE 设置为 D,尽管它之前被定义为 B
    4. 使用InheritsFromParent="true" 重新定义用户宏将新定义添加到任何先前的定义之前,并以指定的Delimiter 分隔。证明:PREPEND 设置为D+B(不是DB+D。)

    以下是我找到的一些额外资源,用于解释 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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这不是故事的全部。

        • 不继承分隔符。仅有的 它们分隔的项目列表是继承的:相同的用户宏在不同的属性表中可以有不同的分隔符,但只使用最后遇到的分隔符。 (我写“最后遇到”是因为在项目级别,我们无法指定分隔符,而使用的是最后一个为该宏指定继承的属性表)
        • 分隔符仅在由 单个字符。分隔符更长 一个字符可能有它的 第一个和/或最后一个字符被剥离 在某些情况下,在错误的尝试中 “加入”值列表。
        • $(Inherit) 似乎在内部工作 用户宏。喜欢聚合
          属性,它用作
          的占位符 父母的价值观,它可以出现多次。当没有找到 $(Inherit) 时,如果设置了继承标志,则在开头隐含。
        • $(NoInherit) 似乎也适用于用户的宏(使 VC 的行为就像未选中复选框一样)。
        • 出现用户宏(和一些内置) 在用于构造属性表的路径时工作(VC 自己的项目转换器使用该功能)。价值 在这种情况下用户的宏不是 不过,总是很直观,尤其是在其他包含的属性表中重新定义时。
        • 一般来说,“继承”或连接的是公式而不是值(即,您不能使用用户宏在属性表中对(例如)$(IntDir) 的本地值进行快照,并希望“通过继承“冒泡”该值,因为继承的实际上是公式“$(IntDir)”,其值最终将在项目/配置/文件级别解析)。
        • 已加载的属性表将被忽略(似乎要避免同一属性表的用户宏聚合两次)
        • “/”和“\”似乎都可以在 属性表路径(在大多数情况下 VS 需要路径的地方)。
        • 属性表路径以 “/”(在宏被解析后)假定在“./”中,其中“.”是的位置 调用表/项目)。如果路径不以“./”、“../”或“drive:/”开头,则相同(不知道关于 UNC)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-13
          • 1970-01-01
          • 1970-01-01
          • 2019-06-12
          • 2011-05-16
          • 2013-06-13
          • 2016-01-13
          相关资源
          最近更新 更多