속성 함수
.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 속성 함수
빌드의 여러 정적 메서드에 액세스하여 산술, 비트 논리 및 이스케이프 문자 지원을 제공할 수 있습니다. 다음 구문을 사용하여 이러한 메서드에 액세스합니다. 여기서 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(이스케이프되지 않은 문자열) |
MSBuild 이스케이프 규칙에 따라 문자열을 이스케이프합니다. |
string Unescape(이스케이프된 문자열) |
MSBuild 이스케이프 규칙에 따라 문자열을 이스케이프 해제합니다. |
int BitwiseOr(첫 번째 int, 두 번째 int) |
첫 번째 및 두 번째에서 비트 OR을 수행합니다(첫 번째 | 두 번째). |
int BitwiseAnd(첫 번째 int, 두 번째 int) |
첫 번째 및 두 번째에서 비트 AND를 수행합니다(첫 번째 & 두 번째). |
int BitwiseXor(첫 번째 int, 두 번째 int) |
첫 번째 및 두 번째에서 비트 XOR을 수행합니다(첫 번째 ^ 두 번째). |
int BitwiseNot(첫 번째 int) |
비트 NOT을 수행합니다(~첫 번째). |
MSBuild GetRegistryValueFromView
The MSBuild GetRegistryValueFromView 속성 함수는 레지스트리 키, 값 및 하나 이상의 정렬된 레지스트리 뷰가 있으면 시스템 레지스트리 데이터를 가져옵니다. 키와 값은 각 레지스트리 뷰에서 발견될 때까지 순서대로 검색됩니다.
이 속성 함수의 구문은 다음과 같습니다.
[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 속성 함수는 레지스트리 키의 값을 반환합니다. 이 함수는 키 이름과 값 이름의 두 인수를 사용합니다. 레지스트리에서 값을 반환합니다. 값 이름을 지정하지 않으면 기본값이 반환됩니다.
다음 예제에서는 이 함수를 사용하는 방법을 보여 줍니다.
$([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 일괄 처리를 참조하십시오.