プロパティ関数
.NET Framework Version 4 では、プロパティ関数を使用して MSBuild スクリプトを評価できます。 プロパティ関数は、プロパティを記述する場所で使用できます。 タスクとは異なり、プロパティ関数はターゲットの外部で使用でき、ターゲットの実行前に評価されます。
MSBuild タスクを使用しなくても、システム時刻の読み取り、文字列の比較、正規表現の照合、その他の処理をビルド スクリプト内で実行できます。 MSBuild では、文字列から数値、数値から文字列への変換を試み、必要に応じてその他の変換を行います。
プロパティ関数の構文
プロパティ関数には次の 3 種類があります。各関数の構文はそれぞれ異なります。
文字列 (インスタンス) プロパティ関数
静的プロパティ関数
MSBuild プロパティ関数
文字列プロパティ関数
ビルド プロパティの値はすべて文字列値です。 文字列 (インスタンス) メソッドを使用してプロパティ値を操作できます。 たとえば、完全パスを表すビルド プロパティからドライブ名 (最初の 3 文字) を抽出できます。次のコードを使用します。
$(ProjectOutputFolder.Substring(0,3))
静的プロパティ関数
ビルド スクリプトでは、さまざまなシステム クラスの静的プロパティと静的メソッドにアクセスできます。 静的プロパティの値を取得するには、次の構文を使用します。ここで、Class はシステム クラスの名前、Property はプロパティの名前です。
$([Class]::Property)
たとえば、ビルド プロパティを現在の日付と時刻に設定するには、次のコードを使用します。
<Today>$([System.DateTime]::Now)</Today>
静的メソッドを呼び出すには、次の構文を使用します。ここで、Class はシステム クラスの名前、Method はメソッドの名前、(Parameters) はメソッドのパラメーター リストです。
$([Class]::Member(Parameters))
たとえば、ビルド プロパティを新しい GUID に設定するには、次のスクリプトを使用します。
<NewGuid>$([System.Guid]::NewGuid())</NewGuid>
静的プロパティ関数では、次のシステム クラスの静的メソッドまたは静的プロパティを使用できます。
System.Byte
System.Char
System.Convert
System.DateTime
System.Decimal
System.Double
System.Enum
System.Guid
System.Int16
System.Int32
System.Int64
System.IO.Path
System.Math
System.UInt16
System.UInt32
System.UInt64
System.SByte
System.Single
System.String
System.StringComparer
System.TimeSpan
System.Text.RegularExpressions.Regex
Microsoft.Build.Utilities.ToolLocationHelper
また、次の静的メソッドと静的プロパティを使用できます。
System.Environment::CommandLine
System.Environment::ExpandEnvironmentVariables
System.Environment::GetEnvironmentVariable
System.Environment::GetEnvironmentVariables
System.Environment::GetFolderPath
System.Environment::GetLogicalDrives
System.IO.Directory::GetDirectories
System.IO.Directory::GetFiles
System.IO.Directory::GetLastAccessTime
System.IO.Directory::GetLastWriteTime
System.IO.Directory::GetParent
System.IO.File::Exists
System.IO.File::GetCreationTime
System.IO.File::GetAttributes
System.IO.File::GetLastAccessTime
System.IO.File::GetLastWriteTime
System.IO.File::ReadAllText
静的プロパティのインスタンス メソッドの呼び出し
オブジェクト インスタンスを返す静的プロパティにアクセスする場合は、そのオブジェクトのインスタンス メソッドを呼び出すことができます。 インスタンス メソッドを呼び出すには、次の構文を使用します。ここで、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 つの長整数の加算演算を行います。 |
double Subtract(double a, double b) |
2 つの倍精度浮動小数点数の減算演算を行います。 |
long Subtract(long a, long b) |
2 つの長整数の減算演算を行います。 |
double Multiply(double a, double b) |
2 つの倍精度浮動小数点数の乗算演算を行います。 |
long Multiply(long a, long b) |
2 つの長整数の乗算演算を行います。 |
double Divide(double a, double b) |
2 つの倍精度浮動小数点数の除算演算を行います。 |
long Divide(long a, long b) |
2 つの長整数の除算演算を行います。 |
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 演算 (first | second) を実行します。 |
int BitwiseAnd(int first, int second) |
1 番目と 2 番目の値に対してビットごとの AND 演算 (first & second) を実行します。 |
int BitwiseXor(int first, int second) |
1 番目と 2 番目の値に対してビットごとの XOR 演算 (first ^ second) を実行します。 |
int BitwiseNot(int first) |
ビットごとの NOT 演算 (~first) を実行します。 |
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 データを取得します。
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
MSBuild GetDirectoryNameOfFileAbove
MSBuild の GetDirectoryNameOfFileAbove プロパティ関数は、パスの現在のディレクトリについて、ディレクトリ内のファイルを検索します。
このプロパティ関数の構文を次に示します。
$[MSBuild]::GetDirectoryNameOfFileAbove(string ThePath, string TheFile)
次に例を示します。
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />
入れ子になったプロパティ関数
プロパティ関数を組み合わせて、より複雑な関数を作成できます。 次に例を示します。
$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))
パス tempFile で指定したファイルの FileAttributes Archive ビット (32 または 0) の値を返します。 プロパティ関数内で列挙データ値を名前で指定することはできません。 代わりに数値 (32) を使用する必要があります。
入れ子になったプロパティ関数でメタデータを使用することもできます。 詳細については、「MSBuild バッチ」を参照してください。