Функции свойств
В платформе .NET Framework версии 4 для оценки скриптов MSBuild можно использовать функции свойств. Функции свойств можно применять при каждом появлении свойств. В отличие от задач, функции свойств можно использовать вне конечных объектов, их оценка выполняется до выполнения какого-либо целевого объекта.
С помощью скриптов построения можно считывать системное время, сравнивать строки, вести поиск по регулярным выражениям и выполнять другие действия, не используя задачи MSBuild. MSBuild осуществит попытку преобразования строки в число и числа в строку, а также другие необходимые преобразования.
Синтаксис функции свойств
Ниже представлены три вида функций свойств. У каждой функции свой синтаксис:
Функции свойств строки (экземпляра)
Функции статических свойств
Функции свойств MSBuild
Функции свойств строки
Все значения свойств построения являются строковыми. Для работы с любым значением свойства можно использовать методы строк (экземпляра). Например, можно извлечь имя диска (первые три символа) из свойства построения, представляющего полный путь, с помощью следующего кода:
$(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
С помощью некоторых статических методов в имеющемся построении можно обеспечить поддержку арифметических и побитовых логических операций, а также поддержку escape-символа. Этими методами можно воспользоваться с помощью следующего синтаксиса, где Method — это имя метода, а Parameters — список параметров для метода.
$([MSBuild]::Method(Parameters))
Например, чтобы сложить два свойства с числовыми значениями, следует использовать следующий код.
$([MSBuild]::Add($(NumberOne), $(NumberTwo))
Ниже представлен список функций свойств MSBuild:
Сигнатура функции |
Описание |
---|---|
double Add(double a, double b) |
Прибавление двух значений double. |
long Add(long a, long b) |
Прибавление двух значений long. |
double Subtract(double a, double b) |
Вычитание двух значений double. |
long Subtract(long a, long b) |
Вычитание двух значений long. |
double Multiply(double a, double b) |
Умножение двух значений double. |
long Multiply(long a, long b) |
Умножение двух значений long. |
double Divide(double a, double b) |
Деление двух значений double. |
long Divide(long a, long b) |
Деление двух значений long. |
double Modulo(double a, double b) |
Остаток от деления двух значений double. |
long Modulo(long a, long b) |
Остаток от деления двух значений long. |
string Escape(string unescaped) |
Добавление escape-значений для строки в соответствии с правилами добавления escape-значений MSBuild. |
string Unescape(string escaped) |
Удаление escape-значений для строки в соответствии с правилами удаления escape-значений MSBuild. |
int BitwiseOr(int first, int second) |
Выполнение побитового оператора OR для значений first и second (first | second). |
int BitwiseAnd(int first, int second) |
Выполнение побитового оператора AND для значений first и second (first & second). |
int BitwiseXor(int first, int second) |
Выполнение побитового оператора XOR для значений first и second (first ^ second). |
int BitwiseNot(int first) |
Выполнение побитового оператора NOT (~first). |
MSBuild GetRegistryValueFromView
Функция свойства GetRegistryValueFromView MSBuild получает данные системного реестра, возвращая раздел реестра, значение реестра и одно или несколько заданных представлений реестра. Поиск раздела и значения выполняется в каждом представлении реестра по порядку до тех пор, пока они не будут найдены.
Данная функция свойства имеет следующий синтаксис:
[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)
В 64-разрядных версиях Windows раздел реестра HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node обеспечивает представление реестра HKEY_LOCAL_MACHINE\SOFTWARE для 32-разрядных приложений.
По умолчанию 32-разрядные приложения, выполняемые в подсистеме WOW64, получают доступ к 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))
получает данные SLRuntimeInstallPath раздела ReferenceAssemblies, выполняя поиск сначала в 64-разрядном представлении реестра, а затем в 32-разрядном.
MSBuild GetRegistryValue
Функция свойства GetRegistryValue MSBuild возвращает значение ключа реестра. Эта функция принимает два аргумента, имя ключа и имя значения. Она возвращает значение из реестра. Если имя значения не определено, то возвращается значение по умолчанию.
В следующих примерах показан способ использования этой функции:
$([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
Функция свойства GetDirectoryNameOfFileAbove MSBuild выполняет поиск файла в каталогах, соседних с текущим каталогом в данном пути.
Данная функция свойства имеет следующий синтаксис:
$[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))))
возвращает значение (32 или 0) бита Archive (класс FileAttributes) файла, путь к которому задан как tempFile. Следует обратить внимание, что значения перечислимых данных не могут возникать по имени в функциях свойств. Вместо этого следует использовать числовое значение (32).
В функциях вложенных свойств также могут возникать метаданные. Дополнительные сведения см. в разделе Пакетная обработка в MSBuild.