次の方法で共有


プロパティ関数

プロパティ関数は、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>

オーバーロードされたメソッドの場合、MSBuild は一致するパラメーターを持つメソッドを検索しようとします。

MSBuild 17.14 以降では、パラメーター構文 out _ を使用して、 out パラメーターを指定できます。 参照パラメーターを参照してください。 out パラメーター値は無視されます。 例えば次が挙げられます。

<IsInteger>$([System.Int32]::TryParse("123", out _))</IsInteger>

入力が整数として正常に解析された場合、プロパティ IsIntegertrue されますが、解析された値は無視されます。

静的プロパティ関数では、次のシステム クラスに対して、.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 個の倍精度浮動小数点数を加算します。
long Add(long a, long b) 2 個の長整数を加算します。
int BitwiseOr(int first, int second) 1 番目と 2 番目でビットごとの OR を実行します (first | second)。
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) を実行します。
string CheckFeatureAvailability(string featureName) このバージョンの MSBuild で指定された機能がサポートされている場合にのみ、機能名を文字列として返します。
string ConvertToBase64(string toEncode) 1 つまたは 2 つの+で終わる、すべてのバイトを base 64 (英数字と/=) に変換した後の文字列を返します。
string ConvertFromBase64(string toDecode) base 64(英数字と+及び/からなる)から変換され、1つまたは2つの=で終わる文字列を返します。
double Divide(double a, double b) 2 個の倍精度浮動小数点数を除算します。
long Divide(long a, long b) 2 個の長整数を除算します。
bool DoesTaskHostExist(string runtime, string architecture) 指定したランタイム値とアーキテクチャ値に対してタスク ホストが現在インストールされているかどうかを返します。 MSBuild DoesTaskHostExist を参照してください。
string Escape(string unescaped) MSBuild エスケープ規則に従って文字列をエスケープします。
string EnsureTrailingSlash(string path) 指定されたパスに末尾のスラッシュがない場合は、追加します。 パスが空の文字列の場合は、変更しません。 MSBuild EnsureTrailingSlash を参照してください。
string FilterTargetFrameworks(string incoming, string filter) 指定したフィルターに一致するターゲット フレームワークの一覧を返します。 incomingのターゲット フレームワークは、filterの目的のターゲット フレームワークのいずれかに一致する場合に保持されます。 MSBuild TargetFramework 関数と TargetPlatform 関数を参照してください。
string GetCurrentToolsDirectory() 現在の MSBuild ツール ディレクトリを取得します。
string GetMSBuildExtensionsPath() MSBuild 拡張機能のパスを取得します。 MSBuild.exeを実行する場合、これは通常、MSBuild 実行可能フォルダーです。 Visual Studio で実行する場合、これは Visual Studio インストール フォルダーの下にある MSBuild サブフォルダーです。
string GetMSBuildSDKsPath() 現在の MSBuild インスタンスの SDK が必要なディレクトリを取得します。
string GetProgramFiles32() 通常、32 ビット ソフトウェア パッケージがインストールされているファイル システム ルート フォルダーを取得します。 たとえば、C:\Program Files (x86) のようにします。
string GetTargetFrameworkIdentifier(string targetFramework) TargetFramework から TargetFrameworkIdentifier を解析します。 MSBuild TargetFramework 関数と TargetPlatform 関数を参照してください。
string GetTargetFrameworkVersion(string targetFramework, int versionPartCount) TargetFramework から TargetFrameworkVersion を解析します。 MSBuild TargetFramework 関数と TargetPlatform 関数を参照してください。
string GetTargetPlatformIdentifier(string targetFramework) TargetFramework から TargetPlatformIdentifier を解析します。 MSBuild TargetFramework 関数と TargetPlatform 関数を参照してください。
string GetTargetPlatformVersion(string targetFramework, int versionPartCount) TargetFramework から TargetPlatformVersion を解析します。 MSBuild TargetFramework 関数と TargetPlatform 関数を参照してください。
string GetToolsDirectory32() 32 ビット バージョンの MSBuild ツールが配置されているディレクトリを取得します。
string GetToolsDirectory64() 64 ビット バージョンの MSBuild ツールが配置されているディレクトリを取得します。
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) 指定されたディレクトリ内のファイルのディレクトリ、またはそのディレクトリの上のディレクトリ構造内の場所を見つけて返します。 MSBuild GetDirectoryNameOfFileAbove を参照してください。
string GetPathOfFileAbove(string file, string startingDirectory) 現在のビルド ファイルの場所以上にあるディレクトリ構造内のファイルの完全パスを検索して返します。指定されている場合は、 startingDirectoryに基づいて返します。 MSBuild GetPathOfFileAbove を参照してください。
object GetRegistryValue(string keyName, string valueName, object defaultValue) レジストリ キーと値の値を取得します。 MSBuild GetRegistryValue を参照してください。
object GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views) レジストリ キー、値、および 1 つ以上の順序付けられたレジストリ ビューを指定して、システム レジストリ データを取得します。 MSBuild GetRegistryValueFromView を参照してください。
string GetVsInstallRoot() MSBuild の現在のインスタンスに関連付けられている Visual Studio インストール フォルダーのルートへの完全パスを取得します。
bool IsOsPlatform(string platformString) 現在の OS プラットフォームが platformStringされているかどうかを指定します。 platformString は、 OSPlatformのメンバーである必要があります。
bool IsOsBsdLike() 現在の OS が BSD スタイルの Unix システムの場合は True。
bool IsOSUnixLike() 現在の OS が Unix システムの場合は True。
bool IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) 候補のターゲット フレームワーク (2 番目の引数) が最初の引数で示されるターゲット フレームワークと互換性がある場合は 'True' を返し、それ以外の場合は false を返します。 MSBuild TargetFramework 関数と TargetPlatform 関数を参照してください。
int LeftShift(int operand, int count) count ビットだけ左にシフトします。 MSBuild 17.7 以降。
string MakeRelative(string basePath, string path) pathを基準にしてbasePathを作成します。 basePath は絶対ディレクトリである必要があります。 pathを相対にできない場合は、逐語的に返されます。 Uri.MakeRelativeUri と似ています。 MSBuild MakeRelative を参照してください。
double Modulo(double a, double b) 2 個の倍精度浮動小数点数を剰余します。
long Modulo(long a, long b) 2 個の長整数を剰余します。
double Multiply(double a, double b) 2 個の倍精度浮動小数点数を乗算します。
long Multiply(long a, long b) 2 個の長整数を乗算します。
string NormalizeDirectory(params string[] path) 指定されたディレクトリの正規化された完全パスを取得し、現在のオペレーティング システムの正しいディレクトリ区切り文字が含まれていることを確認します。また、末尾にスラッシュがあることを確認します。
string NormalizePath(params string[] path) 指定されたパスの正規化された完全パスを取得し、現在のオペレーティング システムの正しいディレクトリ区切り文字が含まれていることを確認します。
int RightShift(int operand, int count) 符号付き整数として、 count ビットで右にシフトします。 MSBuild 17.7 以降。
int RightShiftUnsigned(int operand, int count) オペランドを符号なし整数として扱い、count ビットだけ右にシフトします。 MSBuild 17.7 以降。
object StableStringHash(string toHash, StringHashingAlgorithm algo) 文字列引数を受け取り、安定することが保証されているハッシュ コードを返します。 MSBuild StableStringHash を参照してください。
string SubstringByAsciiChars(string input, int start, int length) 指定した input 位置から始まり、指定した start の長さの length の部分文字列を返し、文字列をASCIIエンコードとして扱います。
double Subtract(double a, double b) 2 個の倍精度浮動小数点数を減算します。
long Subtract(long a, long b) 2 個の長整数を減算します。
string Unescape(string escaped) MSBuild エスケープ規則に従って文字列のエスケープを解除します。
string ValueOrDefault(string conditionValue, string defaultValue) パラメーター defaultValueが空の場合にのみ、パラメーター conditionValue内の文字列を返します。それ以外の場合は、conditionValue値を返します。 MSBuild ValueOrDefault を参照してください。
bool VersionEquals(string a, string b) バージョンtrueaが次の規則に従って等しい場合は、bを返します。 MSBuild バージョン比較関数を参照してください。
bool VersionGreaterThan(string a, string b) バージョン trueが次の規則に従ってaより大きい場合は、bを返します。 MSBuild バージョン比較関数を参照してください。
bool VersionGreaterThanOrEquals(string a, string b) バージョン trueが次の規則に従ってa以上の場合は、bを返します。 MSBuild バージョン比較関数を参照してください。
bool VersionLessThan(string a, string b) バージョン trueが次の規則に従ってa未満の場合は、bを返します。 MSBuild バージョン比較関数を参照してください。
bool VersionLessThanOrEquals(string a, string b) バージョン trueが次の規則に従ってa以下の場合は、bを返します。 MSBuild バージョン比較関数を参照してください。
bool VersionNotEquals(string a, string b) バージョンfalseaが次の規則に従って等しい場合は、bを返します。 MSBuild バージョン比較関数を参照してください。

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

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

$([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 末尾スラッシュを確実にする

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))

上記のコードは、ReferenceAssemblies キーの SLRuntimeInstallPath データを取得します。最初に 64 ビット レジストリ ビューで、次に 32 ビット レジストリ ビューを参照します。

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 以降では、この関数は、使用するハッシュ アルゴリズムを要求する 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>

    <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 プロパティを処理するための複数の関数が定義されています。

関数シグネチャ 説明
FilterTargetFrameworks(string incoming, string filter) 指定したフィルターに一致するターゲット フレームワークの一覧を返します。 incomingのターゲット フレームワークは、filterの目的のターゲット フレームワークのいずれかに一致する場合に保持されます。
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>

    <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>
        <Value8>$([MSBuild]::IsTargetFrameworkCompatible('net8.0', 'net6.0'))</Value8>
    </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)" />
        <Message Text="Value8 = $(Value8)" />
    </Target>
</Project>
Value1 = .NETCoreApp
Value2 = 5.0
Value3 = windows
Value4 = 7.0
Value5 = True
Value6 = False
Value7 = False
Value8 = True

MSBuild FilterTargetFrameworks

MSBuild 17.6 以降 (または .NET 7 以降) では、このプロパティ関数を使用してターゲット フレームワーク モニカー (TFM) の一覧のサブセットを選択し、フィルター引数を指定した TFM の一覧に一致するフレームワークにリストを制限できます。

たとえば、 incomingnet6.0;net7.0;netstandard2.0 され、 filternet7.0;netstandard2.0場合、結果は net7.0;netstandard2.0

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 の条件を参照してください。