2008-09-27 25 views
6

我似乎無法找到微軟關於.vsprops屬性表文件定義用戶宏時Visual Studio的人會如何使用DelimiterInheritsFromParent屬性在UserMacro元素任何有用文檔。.vsprops文件中的'Delimiter'和'InheritsFromParent'屬性是什麼意思?

這裏的示例用法:

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

從上面的例子,我猜「繼承」真正含義「a)如果定義爲非空然後追加分隔符,和b)追加新的定義「作爲非繼承行爲將是簡單地替換任何當前的宏定義。有人有確切消息麼?更好的是,有沒有人有任何建議的Visual Studio .vsprops文件和宏的替代文檔來源?

注意:這是不一樣VisualStudioPropertySheet元件的InheritedPropertySheets屬性,例如:

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

在這種情況下「繼承」基本上意味着「包括」

回答

8

[回答我的問題]

InheritsFromParent意味着前置。爲了驗證這一點,我這樣做,顯示用戶宏在Visual Studio 2008年這裏的工作原理是設置一個實驗:

  • 項目p.vcproj包括屬性表文件d.vsprops使用InheritedPropertySheets標籤(「d」爲衍生) 。
  • 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"/> 
... 

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

頁。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

這裏是我發現的Visual Studio解釋.vsprops文件及相關主題的一些額外的資源,從幾年前的,但它仍然是有幫助的(不DB+D。):

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

0

這裏有關於here的UI版本的文檔。 許多XML文件似乎有些沒有記錄,通常只是給出schema file。你對他們如何運作的猜測是非常正確的。

0

這不是故事的全部。

  • 分隔符不會被繼承。只有 它們分隔的項目列表被繼承:相同的用戶宏可以在不同的屬性表中具有不同的分隔符,但僅使用最後遇到的分隔符。 (我寫了「上次遇到」,因爲在項目級別,我們無法指定分隔符,並且在那裏使用的是最後一個屬性表,它指定了該宏的繼承)
  • 分隔符僅適用於由單個字符構成的 。分隔符不再 超過一個字符可能有其 第一和/或最後一個字符,在某些情況下剝離 ,在一個錯誤的嘗試 「加入」值的列表。
  • $(繼承)似乎裏面 用戶宏工作。像骨料
    特性,它可以作爲一個佔位符
    父母的價值觀,它可以出現多次。當沒有找到$(繼承)時,如果設置了繼承標誌,它就會在開始處隱含。
  • $(NoInherit)也可以在用戶的​​宏中工作(使得VC的行爲就像複選框未被打開一樣)。
  • 用戶宏(以及一些內置插件)出現 用於構建一個屬性表的路徑(VC自己的項目轉換器使用該功能)時工作。但是,在這種情況下用戶宏所取得的值 總是非常直觀,尤其是如果它在其他包含的屬性表中被重新定義。
  • 在一般情況下,什麼被「繼承」或級聯的公式,而不是值(即你不能使用用戶宏程序進行快照(比方說)$(IntDir)的局部值的屬性表,並希望「通過繼承冒泡「這個值,因爲被繼承的實際上是公式」$(IntDir)「,它的值最終將在項目/ config/file級別解決)。
  • 已經裝載被忽略屬性表(似乎以避免相同的屬性片具有聚集兩次其用戶宏)
  • 兩者「/」和「\」出現在 屬性表的路徑工作(在大多數 VS期望路徑的地方)。
  • 與 「/」開始(宏已經解決後)一種屬性表路徑被假定爲在「./」,其中「」是 調用表/項目的位置)。如果路徑不以「./」,「../」或「drive:/」開頭(不知道關於UNC)。
相關問題