Функции свойств
В платформе .NET Framework версий 4 и 4,5, функции свойств можно использовать для оценки скрипты MSBuild.Функции свойств можно применять при каждом появлении свойств.В отличие от задач, функции свойств можно использовать вне конечных объектов, их оценка выполняется до выполнения какого-либо целевого объекта.
С помощью скриптов построения можно считывать системное время, сравнивать строки, вести поиск по регулярным выражениям и выполнять другие действия, не используя задачи MSBuild.MSBuild осуществит попытку преобразования строки в число и числа в строку, а также другие необходимые преобразования.
Содержание раздела
Синтаксис функции свойств
Функции свойств строки
Функции статических свойств
Вызов методов экземпляра для статических свойств
Функции свойств MSBuild
Функции вложенных свойств
MSBuild DoesTaskHostExist
MSBuild GetDirectoryNameOfFileAbove
MSBuild GetRegistryValue
MSBuild GetRegistryValueFromView
MSBuild MakeRelative
MSBuild ValueOrDefault
Синтаксис функции свойств
Ниже представлены три вида функций свойств. У каждой функции свой синтаксис:
Функции свойств строки (экземпляра)
Функции статических свойств
Функции свойств 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]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))
Этот пример возвращает значение бита FileAttributesArchive (32 или 0) файла, заданного пути tempFile.Следует обратить внимание, что значения перечислимых данных не могут возникать по имени в функциях свойств.Вместо этого следует использовать числовое значение (32).
В функциях вложенных свойств также могут возникать метаданные.Дополнительные сведения см. в разделе Пакетная обработка в MSBuild.
MSBuild DoesTaskHostExist
Функция свойства DoesTaskHostExist в MSBuild получает установлено, является ли узел задачи в настоящее время для указанных значений среды выполнения и архитектуры.
Эта функция свойства имеет следующий синтаксис:
$[MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture)
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 GetRegistryValue
Функция свойства GetRegistryValue MSBuild возвращает значение ключа реестра.Эта функция принимает 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 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 MakeRelative
Функции свойств MSBuild MakeRelative возвращает относительный путь второго пути относительно первого пути.Каждый путь может быть файлом или папкой.
Эта функция свойства имеет следующий синтаксис:
$[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 ValueOrDefault
Функции свойств MSBuild ValueOrDefault возвращает первый аргумент, если она не будет значение null или является пустой.Если первый аргумент имеет значение null или является пустым, то функция вернет второй аргумент.
В следующем примере показано, как эта функция используется.
<Project ToolsVersion="4.0" xmlns="https://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
-->