次の方法で共有


プロパティ関数

プロパティ関数は、MSBuild プロパティ定義に表示される .NET メソッドの呼び出しです。 通常、これらを使用して、より複雑なロジックを必要とするプロパティ定義を構築します。

タスクとは異なり、プロパティ関数はターゲットの外部で使用できます。 プロパティ関数は、プロパティまたは項目が展開されるたびに評価されます。 そのため、ターゲットの外部にあるプロパティと項目の場合、プロパティ関数はターゲットを実行する前に評価されます。 ターゲット内のプロパティ グループと項目グループの場合、ターゲットの実行時にプロパティ関数が評価されます。

MSBuild タスクを使用しないと、システム時刻の読み取り、文字列の比較、正規表現の照合、ビルド スクリプトでのその他のアクションの実行を行うことができます。 MSBuild は、文字列を数値に変換し、数値を文字列に変換し、必要に応じて他の変換を行います。

プロパティ関数から返される文字列値の特殊文字はエスケープされています。 値をプロジェクト ファイルに直接配置されたかのように扱う場合は、 $([MSBuild]::Unescape()) を使用して特殊文字をエスケープします。

プロパティ関数の構文

これらは 3 種類のプロパティ関数です。各関数には異なる構文があります。

  • 文字列 (インスタンス) プロパティ関数
  • 静的プロパティ関数
  • MSBuild プロパティ関数

文字列プロパティ関数

すべてのビルド プロパティ値は、単なる文字列値です。 文字列 (インスタンス) メソッドを使用して、任意のプロパティ値を操作できます。 たとえば、次のコードを使用して、完全なパスを表すビルド プロパティからドライブ名 (最初の 3 文字) を抽出できます。

$(ProjectOutputFolder.Substring(0,3))

静的プロパティ関数

ビルド スクリプトでは、多くのシステム クラスの静的プロパティとメソッドにアクセスできます。 静的プロパティの値を取得するには、次の構文を使用します。ここで、 Class はシステム クラスの名前、 Property はプロパティの名前です。

$([Class]::Property)

たとえば、次のコードを使用して、ビルド プロパティを現在の日時に設定できます。

<Today>$([System.DateTime]::Now)</Today>

静的メソッドを呼び出すには、次の構文を使用します。ここで、 Class はシステム クラスの名前、 Method はメソッドの名前、 (Parameters) はメソッドのパラメーター リストです。

$([Class]::Method(Parameters))

たとえば、ビルド プロパティを新しい GUID に設定するには、次のスクリプトを使用できます。

<NewGuid>$([System.Guid]::NewGuid())</NewGuid>

静的プロパティ関数では、次のシステム クラスに対して .NET Standard 2.0 で定義されている任意のパブリック静的メソッドまたはプロパティを使用できます。

.NET Standard 2.0 で定義されていないメソッドとプロパティは、それらをサポートする環境で MSBuild を使用する場合に使用できますが、すべての状況で使用できることを保証することはできません。 互換性の理由から、避けるのが最善です。

さらに、次の静的メソッドとプロパティを使用できます。

System.OperatingSystem プロパティ関数

System.OperatingSystem プロパティ関数は、MSBuild が実行されているオペレーティング システムに関する情報を返します。 たとえば、プロジェクトが Linux を対象とし、macOS でビルドした場合、プロパティ関数は macOS に関する情報を返します。

.NET (dotnet build) で実行されている MSBuild では、 System.OperatingSystem クラスのすべての静的メソッドは静的プロパティ関数として呼び出されます。

.NET Framework (MSBuild.exe) で実行されている MSBuild では、次の System.OperatingSystem メソッドのみが静的プロパティ関数として呼び出されます。 MSBuild では内部的に実装されます。これは、 System.OperatingSystem が .NET Framework で定義していないためです。 System.OperatingSystem::IsTvOSなど、.NET SDK がないオペレーティング システムのメソッドは呼び出しできません。

次の例は、これらのプロパティ関数の使用方法を示しています。

<IsWindows>$([System.OperatingSystem]::IsWindows())</IsWindows>

静的プロパティに対するインスタンス メソッドの呼び出し

オブジェクト インスタンスを返す静的プロパティにアクセスする場合は、そのオブジェクトのインスタンス メソッドを呼び出すことができます。 インスタンス メソッドを呼び出すには、次の構文を使用します。ここで、 Class はシステム クラスの名前、 Property はプロパティの名前、 Method はメソッドの名前、 (Parameters) はメソッドのパラメーター リストです。

$([Class]::Property.Method(Parameters))

クラスの名前は、名前空間で完全修飾されている必要があります。

たとえば、次のコードを使用して、ビルド プロパティを現在の日付に設定できます。

<Today>$([System.DateTime]::Now.ToString('yyyy.MM.dd'))</Today>

MSBuild プロパティ関数

ビルド内のいくつかの静的メソッドにアクセスして、算術、ビットごとの論理、エスケープ文字のサポートを提供できます。 これらのメソッドには、次の構文を使用してアクセスします。ここで、 Method はメソッドの名前、 (Parameters) はメソッドのパラメーター リストです。

$([MSBuild]::Method(Parameters))

たとえば、数値を持つ 2 つのプロパティをまとめて追加するには、次のコードを使用します。

$([MSBuild]::Add($(NumberOne), $(NumberTwo)))

MSBuild プロパティ関数の一覧を次に示します。

関数シグネチャ 説明
double Add(double a, double b) 2 つの double を追加します。
long Add(long a, long b) 2 つの long を追加します。
double Subtract(double a, double b) 2 つの倍精度浮動小数点型 (double) を減算します。
long Subtract(long a, long b) 2 つの long を減算します。
double Multiply(double a, double b) 二つの倍精度浮動小数点型 double を乗算します。
long Multiply(long a, long b) 2 つの long を乗算します。
double Divide(double a, double b) 2 つの倍精度浮動小数点型 (double) を除算します。
long Divide(long a, long b) 2 つの long を除算します。
double Modulo(double a, double b) 剰余 2 倍。
long Modulo(long a, long b) 2つの長整数の剰余。
string Escape(string unescaped) MSBuild エスケープ規則に従って文字列をエスケープします。
string Unescape(string escaped) MSBuild エスケープ規則に従って文字列のエスケープを解除します。
int BitwiseOr(int first, int second) 1 番目と 2 番目 (最初の | 秒) にビットごとの OR を実行します。
int BitwiseAnd(int first, int second) 1 番目と 2 番目 (1 番目と 2 番目) にビットごとの AND を実行します。
int BitwiseXor(int first, int second) 1 番目と 2 番目の (最初 ^ 2 番目) にビット単位の XOR を実行します。
int BitwiseNot(int first) ビットごとの NOT (~first) を実行します。
bool IsOsPlatform(string platformString) 現在の OS プラットフォームが platformStringされているかどうかを指定します。 platformString は、 OSPlatformのメンバーである必要があります。
bool IsOSUnixLike() 現在の OS が Unix システムの場合は True。
string NormalizePath(params string[] path) 指定されたパスの正規化された完全パスを取得し、現在のオペレーティング システムの正しいディレクトリ区切り文字が含まれていることを確認します。
string NormalizeDirectory(params string[] path) 指定されたディレクトリの正規化された完全パスを取得し、現在のオペレーティング システムの正しいディレクトリ区切り文字が含まれていることを確認します。また、末尾にスラッシュがあることを確認します。
string EnsureTrailingSlash(string path) 指定されたパスに末尾のスラッシュがない場合は、追加します。 パスが空の文字列の場合は、変更しません。
string GetPathOfFileAbove(string file, string startingDirectory) 現在のビルド ファイルの場所以上にあるディレクトリ構造内のファイルの完全パスを検索して返します。指定されている場合は、 startingDirectoryに基づいて返します。
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) 指定されたディレクトリ内のファイルのディレクトリ、またはそのディレクトリの上のディレクトリ構造内の場所を見つけて返します。
string MakeRelative(string basePath, string path) pathを基準にしてbasePathを作成します。 basePath は絶対ディレクトリである必要があります。 pathを相対にできない場合は、逐語的に返されます。 Uri.MakeRelativeUri に似ています。
string ValueOrDefault(string conditionValue, string defaultValue) パラメーター defaultValueが空の場合にのみ、パラメーター conditionValue内の文字列を返します。それ以外の場合は、conditionValue値を返します。
string ConvertToBase64(string toEncode) 1 つまたは 2 つの+で終わる、すべてのバイトを base 64 (英数字と/=) に変換した後の文字列を返します。
string ConvertFromBase64(string toDecode) base 64(英数字と+及び/からなる)から変換され、1つまたは2つの=で終わる文字列を返します。

入れ子になったプロパティ関数

次の例に示すように、プロパティ関数を組み合わせて、より複雑な関数を形成できます。

$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))

次の使用例は、 FileAttributesの値を返します。 Archive パス tempFileによって指定されたファイルのビット (32 または 0)。 列挙されたデータ値は、一部のコンテキストでは名前で表示できないことに注意してください。 前の例では、数値 (32) を代わりに使用する必要があります。 それ以外の場合は、呼び出されるメソッドの期待に応じて、列挙型データ値を使用する必要があります。 次の例では、列挙値が RegexOptionsECMAScript は、このメソッドが想定するように数値を変換できないため、使用する必要があります。

<PropertyGroup>
    <GitVersionHeightWithOffset>$([System.Text.RegularExpressions.Regex]::Replace("$(PrereleaseVersion)", "^.*?(\d+)$", "$1", "System.Text.RegularExpressions.RegexOptions.ECMAScript"))</GitVersionHeightWithOffset>
</PropertyGroup>

メタデータは、入れ子になったプロパティ関数にも含まれる場合があります。 詳細については、「バッチ処理 を参照してください。

MSBuild DoesTaskHostExist

MSBuild の DoesTaskHostExist プロパティ関数は、指定されたランタイム値とアーキテクチャ値に対してタスク ホストが現在インストールされているかどうかを返します。

このプロパティ関数には、次の構文があります。

$([MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture))

MSBuild EnsureTrailingSlash

MSBuild の EnsureTrailingSlash プロパティ関数では、末尾にスラッシュがまだ存在しない場合に追加されます。

このプロパティ関数には、次の構文があります。

$([MSBuild]::EnsureTrailingSlash('$(PathProperty)'))

MSBuild GetDirectoryNameOfFileAbove

MSBuild GetDirectoryNameOfFileAbove プロパティ関数は、指定したディレクトリから始まる、指定したファイルを含むディレクトリを上方向に検索します。 見つかった場合は、ファイルを含む最も近いディレクトリの完全なパスを返します。それ以外の場合は空の文字列を返します。

このプロパティ関数には、次の構文があります。

$([MSBuild]::GetDirectoryNameOfFileAbove(string startingDirectory, string fileName))

次の例は、一致するものが見つかった場合にのみ、現在のフォルダー内または現在のフォルダーの上に最も近い EnlistmentInfo.props ファイルをインポートする方法を示しています。

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />

この例は、代わりに GetPathOfFileAbove 関数を使用して、より簡潔に記述できることに注意してください。

<Import Project="$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))' != '' " />

MSBuild GetPathOfFileAbove

MSBuild GetPathOfFileAbove プロパティ関数は、指定したディレクトリから始まる、指定したファイルを含むディレクトリを上方向に検索します。 見つかった場合は、最も近い一致するファイルの完全なパスを返します。それ以外の場合は空の文字列を返します。

このプロパティ関数には、次の構文があります。

$([MSBuild]::GetPathOfFileAbove(string file, [string startingDirectory]))

ここで file は検索するファイルの名前で、 startingDirectory は検索を開始するオプションのディレクトリです。 既定では、現在のファイルの独自のディレクトリで検索が開始されます。

この例では、 dir.props という名前のファイルを現在のディレクトリ内または現在のディレクトリの上にインポートする方法を示します。一致するものが見つかった場合に限ります。

<Import Project="$([MSBuild]::GetPathOfFileAbove(dir.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(dir.props))' != '' " />

機能的に同等である。

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))' != '' " />

ただし、現在のファイルと一致しないように、親ディレクトリで検索を開始する必要がある場合があります。 この例では、Directory.Build.props ファイルを再帰的にインポートすることなく、階層がより高いレベルにある最も近い Directory.Build.props ファイルをインポートする方法を示します。

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

機能的に同等である。

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildThisFileDirectory)../', 'Directory.Build.props'))/Directory.Build.props" />

MSBuild GetRegistryValue

MSBuild GetRegistryValue プロパティ関数は、レジストリ キーの値を返します。 この関数は、キー名と値名の 2 つの引数を受け取り、レジストリから値を返します。 値名を指定しない場合は、既定値が返されます。

次の例は、この関数の使用方法を示しています。

$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, ``))                                  // default value
$([MSBuild]::GetRegistryValue(`HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\10.0\Debugger`, `SymbolCacheDir`))
$([MSBuild]::GetRegistryValue(`HKEY_LOCAL_MACHINE\SOFTWARE\(SampleName)`, `(SampleValue)`))             // parens in name and value

Warnung

.NET SDK バージョンの MSBuild (dotnet build) では、この関数はサポートされていません。

MSBuild GetRegistryValueFromView

MSBuild GetRegistryValueFromView プロパティ関数は、レジストリ キー、値、および 1 つ以上の順序付けられたレジストリ ビューを指定して、システム レジストリ データを取得します。 キーと値は、見つかるまで各レジストリ ビューで順番に検索されます。

このプロパティ関数の構文は次のとおりです。

[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)

Windows 64 ビット オペレーティング システムは、32 ビット アプリケーション のHKEY_LOCAL_MACHINE\SOFTWARE レジストリ ビューを表示する HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node レジストリ キーを保持します。

既定では、WOW64 で実行されている 32 ビット アプリケーションは 32 ビット レジストリ ビューにアクセスし、64 ビット アプリケーションは 64 ビット レジストリ ビューにアクセスします。

次のレジストリ ビューを使用できます。

レジストリ ビュー 定義
RegistryView.Registry32 32 ビット アプリケーション レジストリ ビュー。
RegistryView.Registry64 64 ビット アプリケーション レジストリ ビュー。
RegistryView.Default アプリケーションが実行されているプロセスに一致するレジストリ ビュー。

次に例を示します。

$([MSBuild]::GetRegistryValueFromView('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Silverlight\v3.0\ReferenceAssemblies', 'SLRuntimeInstallPath', null, RegistryView.Registry64, RegistryView.Registry32))

はじめに 64 ビット レジストリ ビュー、その後 32 ビット レジストリ ビューでReferenceAssembliesキーのSLRuntimeInstallPathデータを取得します。

Warnung

.NET SDK バージョンの MSBuild (dotnet build) では、この関数はサポートされていません。

MSBuild MakeRelative

MSBuild MakeRelative プロパティ関数は、最初のパスに対する 2 番目のパスの相対パスを返します。 各パスには、ファイルまたはフォルダーを指定できます。

このプロパティ関数には、次の構文があります。

$([MSBuild]::MakeRelative($(FileOrFolderPath1), $(FileOrFolderPath2)))

次のコードは、この構文の例です。

<PropertyGroup>
    <Path1>c:\users\</Path1>
    <Path2>c:\users\username\</Path2>
</PropertyGroup>

<Target Name = "Go">
    <Message Text ="$([MSBuild]::MakeRelative($(Path1), $(Path2)))" />
    <Message Text ="$([MSBuild]::MakeRelative($(Path2), $(Path1)))" />
</Target>

<!--
Output:
   username\
   ..\
-->

MSBuild StableStringHash

MSBuild StableStringHash プロパティ関数は、文字列引数を受け取り、安定することが保証されているハッシュ コードを返します。つまり、同じ文字列入力に対して常に同じコードが返されます。 返されるハッシュは、MSBuild または dotnet build が使用されているかどうかに関係なく同じであり、.NET メソッド GetHashCodeとは異なり、プラットフォーム アーキテクチャ全体で安定しています。 異なる MSBuild バージョン間で安定している保証はありません。

この関数は、MSBuild 16.9.0 以降で使用できます。

次の例は、この関数の使用方法を示しています。

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

MSBuild バージョン 17.10.0 から、この関数は、使用するハッシュ アルゴリズムを要求する 2 番目の省略可能な引数を受け入れます。

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1", "Sha256"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

2 番目の引数では大文字と小文字が区別されず、現在、次の値がサポートされています。

  • レガシ - 2 番目の引数を指定せずに関数を呼び出す場合と同じ動作を保持します。 string.GetHashCodeと同様のプロパティを持つ符号付き 32 ビット整数を返します。
  • Fnv1a32bit - 指定された文字列の バージョン '1a' ハッシュの Fowler-Noll-Vo ハッシュ を表す符号付き 32 ビット整数を返します。
  • Fnv1a64bit - 指定された文字列の バージョン '1a' ハッシュの Fowler-Noll-Vo ハッシュ を表す符号付き 64 ビット整数を返します。
  • Sha256 - 指定された文字列の SHA256 ハッシュを表す未修正の 16 進文字列を返します。

MSBuild ValueOrDefault (デフォルト値)

MSBuild ValueOrDefault プロパティ関数は、null または空でない限り、最初の引数を返します。 最初の引数が null または空の場合、関数は 2 番目の引数を返します。

次の例は、この関数の使用方法を示しています。

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <Value1>$([MSBuild]::ValueOrDefault('$(UndefinedValue)', 'a'))</Value1>
        <Value2>$([MSBuild]::ValueOrDefault('b', '$(Value1)'))</Value2>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
    </Target>
</Project>

<!--
Output:
  Value1 = a
  Value2 = b
-->

MSBuild TargetFramework 関数と TargetPlatform 関数

MSBuild 16.7 以降では、 TargetFramework プロパティと TargetPlatform プロパティを処理するための複数の関数が定義されています。

関数シグネチャ 説明
GetTargetFrameworkIdentifier(string targetFramework) TargetFramework から TargetFrameworkIdentifier を解析します。
GetTargetFrameworkVersion(string targetFramework, int versionPartCount) TargetFramework から TargetFrameworkVersion を解析します。
GetTargetPlatformIdentifier(string targetFramework) TargetFramework から TargetPlatformIdentifier を解析します。
GetTargetPlatformVersion(string targetFramework, int versionPartCount) TargetFramework から TargetPlatformVersion を解析します。
IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) 候補のターゲット フレームワーク (2 番目の引数) が最初の引数で示されるターゲット フレームワークと互換性がある場合は 'True' を返し、それ以外の場合は false を返します。

versionPartCountGetTargetFrameworkVersionGetTargetPlatformVersion パラメーターの既定値は 2 です。

次の例は、これらの関数の使用方法を示しています。

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <PropertyGroup>
        <Value1>$([MSBuild]::GetTargetFrameworkIdentifier('net5.0-windows7.0'))</Value1>
        <Value2>$([MSBuild]::GetTargetFrameworkVersion('net5.0-windows7.0'))</Value2>
        <Value3>$([MSBuild]::GetTargetPlatformIdentifier('net5.0-windows7.0'))</Value3>
        <Value4>$([MSBuild]::GetTargetPlatformVersion('net5.0-windows7.0'))</Value4>
        <Value5>$([MSBuild]::IsTargetFrameworkCompatible('net5.0-windows', 'net5.0'))</Value5>
        <Value6>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net6.0'))</Value6>
        <Value7>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net8.0'))</Value7>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
        <Message Text="Value3 = $(Value3)" />
        <Message Text="Value4 = $(Value4)" />
        <Message Text="Value5 = $(Value5)" />
        <Message Text="Value6 = $(Value6)" />
        <Message Text="Value7 = $(Value7)" />
    </Target>
</Project>
Value1 = .NETCoreApp
Value2 = 5.0
Value3 = windows
Value4 = 7.0
Value5 = True
Value6 = False
Value7 = False

MSBuild バージョン比較関数

MSBuild 16.5 以降では、バージョンを表す文字列を比較するための複数の関数が定義されています。

条件の比較演算子 は、 System.Version オブジェクトとして解析できる文字列を比較できますが、比較によって予期しない結果が発生する可能性があります。 プロパティ関数を優先します。

関数シグネチャ 説明
VersionEquals(string a, string b) バージョンtrueaが次の規則に従って等しい場合は、bを返します。
VersionGreaterThan(string a, string b) バージョン trueが次の規則に従ってaより大きい場合は、bを返します。
VersionGreaterThanOrEquals(string a, string b) バージョン trueが次の規則に従ってa以上の場合は、bを返します。
VersionLessThan(string a, string b) バージョン trueが次の規則に従ってa未満の場合は、bを返します。
VersionLessThanOrEquals(string a, string b) バージョン trueが次の規則に従ってa以下の場合は、bを返します。
VersionNotEquals(string a, string b) バージョンfalseaが次の規則に従って等しい場合は、bを返します。

これらのメソッドでは、バージョンは System.Version のように解析されます。ただし、次の例外があります。

  • 先頭 v または V は無視され、 $(TargetFrameworkVersion)との比較が可能になります。

  • 最初の '-' または '+' からバージョン文字列の末尾まではすべて無視されます。 これにより、セマンティック バージョン (semver) を渡すことができますが、順序は semver と同じではありません。 代わりに、プレリリース指定子とビルド メタデータには並べ替えの重みはありません。 これは、たとえば、 >= x.y の機能を有効にして、 x.y.z-preを開始する場合などに便利です。

  • 指定されていない部分は、0 個の値の部分と同じです。 (x == x.0 == x.0.0 == x.0.0.0)。

  • 空白は整数コンポーネントでは使用できません。

  • メジャー バージョンのみが有効です (33.0.0.0 と等しい)

  • + は、整数コンポーネントの正符号として許可されていません (semver メタデータとして扱われ、無視されます)

ヒント

TargetFramework プロパティの比較では、通常、バージョンを抽出して比較するのではなく、IsTargetFrameworkCompatible を使用する必要があります。 これにより、TargetFrameworkとバージョンが異なるTargetFrameworkIdentifierを比較できます。

MSBuild 条件関数

Exists関数とHasTrailingSlash関数はプロパティ関数ではありません。 Condition属性で使用できます。 MSBuild の条件を参照してください。