属性函数
在 .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。
<Today>$([System.DateTime]::Now.ToString("yyyy.MM.dd"))</Today>
MSBuild 属性函数
可以访问生成中的许多静态方法,以提供算术、按位逻辑和转义字符支持。可以使用以下语法访问这些方法,其中 Method 是方法的名称,Parameters 是方法的参数列表。
$([MSBuild]::Method(Parameters))
例如,要一起添加两个具有数字值的属性,请使用以下代码。
$([MSBuild]::Add($(NumberOne), $(NumberTwo))
下面列出了 MSBuild 属性函数:
函数签名 |
描述 |
---|---|
double Add(双精度型值 a, 双精度型值 b) |
将两个双精度型值相加。 |
long Add(长型值 a, 长型值 b) |
将两个长型值相加。 |
double Subtract(双精度型值 a, 双精度型值 b) |
将两个双精度型值相减。 |
long Subtract(长型值 a, 长型值 b) |
将两个长型值相减。 |
double Multiply(双精度型值 a, 双精度型值 b) |
将两个双精度型值相乘。 |
long Multiply(长型值 a, 长型值 b) |
将两个长型值相乘。 |
double Divide(双精度型值 a, 双精度型值 b) |
将两个双精度型值相除。 |
long Divide(长型值 a, 长型值 b) |
将两个长型值相除。 |
double Modulo(双精度型值 a, 双精度型值 b) |
对两个双精度型值取模。 |
long Modulo(长型值 a, 长型值 b) |
对两个长型值取模。 |
string Escape(未转义字符串) |
根据 MSBuild 转义规则对字符串进行转义。 |
string Unescape(已转义字符串) |
根据 MSBuild 转义规则取消对字符串进行转义。 |
int BitwiseOr(第一个整型值, 第二个整型值) |
对第一个值和第二个值执行按位 OR(第一个值 | 第二个值)。 |
int BitwiseAnd(第一个整型值, 第二个整型值) |
对第一个值和第二个值执行按位 AND(第一个值 & 第二个值)。 |
int BitwiseXor(第一个整型值, 第二个整型值) |
对第一个值和第二个值执行按位 XOR(第一个值 ^ 第二个值)。 |
int BitwiseNot(第一个整型值) |
执行按位 NOT(~第一个值)。 |
嵌套的属性函数
如下面的示例所示,可以将属性函数窗体在一起。
$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))
此示例返回 FileAttributesArchive 的值 bit (32 个或 0 个路径所指定的) 文件 tempFile。请注意,枚举的数据值不能以名称形式显示在属性函数内。必须改用数字值 (32)。
元数据也可以出现在嵌套的属性函数中。有关更多信息,请参见MSBuild 批处理。
MSBuild DoesTaskHostExist
在 MSBuild 的 DoesTaskHostExist 属性函数返回任务主机是否为指定的运行时和体系结构值当前安装。
该属性函数具有以下语法:
$[MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture)
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 GetRegistryValue
MSBuild GetRegistryValue 属性函数返回注册表项的值。此函数采用两个参数、键名和值名称,然后从注册表中返回值。如果未指定值名称,则返回默认值。
下面的示例演示如何使用此函数:
$([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
MSBuild GetRegistryValueFromView 属性函数在给定了注册表项、值以及一个或多个经过排序的注册表视图的情况下,获取系统注册表数据。该属性函数将按顺序在每个注册表视图中搜索注册表项和值,直至找到它们。
该属性函数的语法是:
[MSBuild]::GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views)
Windows 64 位操作系统维护一个 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node 注册表项,它表示 32 位应用程序的 HKEY_LOCAL_MACHINE\SOFTWARE 注册表视图。
默认情况下,在 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 MakeRelative
MakeRelative MSBuild 属性函数返回第二个路径的相对路径相对于第一个路径。每个路径可以是文件或文件夹。
该属性函数具有以下语法:
$[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
除非它是空或 null,ValueOrDefault MSBuild 属性函数返回第一个参数。如果第一个参数为 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
-->