8

Visual Studio のプロパティ シート ファイルでユーザー マクロを定義するときに、要素内の属性と属性をどのように使用するかについて、Microsoft からの有用なドキュメントが見つからないようです。DelimiterInheritsFromParentUserMacro.vsprops

使用例は次のとおりです。

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

上記の例から、 「継承」は実際には「a) 定義が空でない場合は区切り文字を追加し、b) 新しい定義を追加する」ことを意味すると推測しています。意味。誰かが確かに知っていますか?.vspropsさらに良いことに、Visual Studio のファイルとマクロに関する代替ドキュメントの推奨ソースはありますか?

注: これは要素の属性とは異なります。たとえば、次のようになります。InheritedPropertySheetsVisualStudioPropertySheet

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

この場合、「継承」は基本的に「含める」ことを意味します。

4

3 に答える 3

9

【自問自答】

InheritsFromParent先頭に追加することを意味します。これを確認するために、Visual Studio 2008 でユーザー マクロがどのように機能するかを明らかにする実験を行いました。セットアップは次のとおりです。

  • プロジェクトには、タグを使用しp.vcprojてプロパティ シート ファイル(派生d.vspropsの 'd' ) が含まれます。InheritedPropertySheets
  • d.vspropsプロパティ シート ファイルが含まれます( baseb.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"/>
...

p.vcproj

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

ビルド出力

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

これらの結果から、次のことが結論付けられます。

  1. PerformEnvironmentSet="true"ビルド イベントに使用される環境でユーザー マクロを定義するために必要です。証明:NOENVビルド出力には表示されません。
  2. ユーザー マクロは、またはに関係なく、含まれているプロパティ シートから常に継承されます。証明: inは環境に設定されておらず、 inはを必要とせずに使用されています。PerformEnvironmentSetInheritsFromParentb.vspropsNOENVd.vspropsInheritsFromParent
  3. ユーザー マクロを単純に再定義すると、以前の定義が上書きされます。Proof:OVERRIDEは に設定されてDいますが、以前は として定義されていましたB
  4. を使用してユーザー マクロを再定義すると、新しい定義が以前の定義のInheritsFromParent="true" 先頭Delimiterに追加され、指定された. 証明:PREPENDD+B(notDまたはB+D.)に設定されます。

Visual Studio.vspropsファイルと関連トピックの説明のために見つけた追加のリソースを次に示します。これは数年前のものですが、今でも役に立ちます。

VC プロジェクト システムの理解 パート I: ファイルとツール

VC プロジェクト システムの理解 パート II: 構成とプロジェクト プロパティ ページ ダイアログ

VC プロジェクト システムの理解 パート III: マクロ、環境変数、および共有

VC プロジェクト システムの理解パート IV: プロパティとプロパティの継承

VC プロジェクト システムの理解パート V: ビルド、ツール、および依存関係

VC プロジェクト システムの理解 パート VI: カスタム ビルド ステップとビルド イベント

VC プロジェクト システムの理解 パート VII: "makefile" プロジェクトと (再) 環境の使用

于 2008-09-28T05:26:05.780 に答える
0

それはすべてではありません。

  • 区切り文字は継承されません。区切り文字のリストのみが継承されます。同じユーザーマクロは、異なるプロパティシートで異なる区切り文字を持つことができますが、最後に検出された区切り文字のみが使用されます。(プロジェクトレベルでは区切り文字を指定できず、そこで使用されるのはそのマクロの継承を指定した最後のプロパティシートであるため、「最後に遭遇した」と記述します)
  • 区切り文字は、単一の文字で構成されている場合にのみ機能します。1文字より長い区切り文字は、値のリストを誤って「結合」しようとすると、場合によっては最初または最後の文字が削除されることがあります。
  • $(継承)はユーザーマクロ内で機能しているように見えます。集計
    プロパティの場合と同様に
    、親の値のプレースホルダーとして機能し、複数回表示される可能性があります。$(Inherit)が見つからない場合、継承フラグが設定されていれば、最初にそれが暗示されます。
  • $(NoInherit)は、ユーザーのマクロでも機能しているように見えます(VCがチェックボックスがオフになっているように動作します)。
  • ユーザーマクロ(および一部の組み込み)は、プロパティシートのパスを作成するために使用すると機能するように見えます(VC独自のプロジェクトコンバーターはその機能を使用します)。ただし、この状況でユーザーのマクロが取得する値は、特に含まれている他のプロパティシートで再定義された場合は、必ずしも直感的ではありません。
  • 一般に、「継承」または連結されるのは数式であり、値ではありません(つまり、ユーザーマクロを使用して、プロパティシートの(たとえば)$(IntDir)のローカル値のスナップショットを作成し、「バブルアップ」することはできません。継承されるのは実際には式「$(IntDir)」であり、その値は最終的にプロジェクト/構成/ファイルレベルで解決されるため、継承によるその値。
  • すでにロードされているプロパティシートは無視されます(同じプロパティシートのユーザーマクロが2回集約されるのを避けるためのようです)
  • 「/」と「\」の両方がプロパティシートパスで機能しているように見えます(およびVSがパスを予期しているほとんどの場所で)。
  • 「/」で始まるプロパティシートパス(マクロが解決された後)は、「。/」にあると見なされます。ここで、「。」は、コーリングシート/プロジェクトの場所です)。パスが「./」、「../」、または「drive:/」で始まらない場合も同じです(UNCについては不明)。
于 2011-02-15T12:51:17.580 に答える
0

これの UI バージョンに関するドキュメントがここにあります。多くの XML ファイルはドキュメント化されていないように見え、多くの場合、スキーマ ファイルを提供するだけです。それらがどのように機能するかについてのあなたの推測はかなり正しいです。

于 2008-09-27T17:14:50.750 に答える