다음을 통해 공유


속성 함수

속성 함수는 MSBuild 속성 정의에 표시되는 .NET 메서드에 대한 호출입니다. 일반적으로 더 복잡한 논리가 필요한 속성 정의를 생성하는 데 사용합니다.

작업과 달리 속성 함수는 대상 외부에서 사용할 수 있습니다. 속성 함수는 속성 또는 항목이 확장될 때마다 평가됩니다. 따라서 대상 외부의 속성 및 항목의 경우 대상이 실행되기 전에 속성 함수가 평가됩니다. 대상 내의 속성 그룹 및 항목 그룹의 경우 대상이 실행될 때 속성 함수가 평가됩니다.

MSBuild 작업을 사용하지 않고 시스템 시간을 읽고, 문자열을 비교하고, 정규식을 일치시키고, 빌드 스크립트에서 다른 작업을 수행할 수 있습니다. MSBuild는 문자열을 숫자와 숫자로 변환하고 필요에 따라 다른 변환을 시도합니다.

속성 함수에서 반환된 문자열 값에는 특수 문자 가 이스케이프됩니다. 값이 프로젝트 파일에 직접 배치된 것처럼 처리되도록 하려면 특수 문자의 이스케이프를 해제하는 데 사용합니다 $([MSBuild]::Unescape()) .

속성 함수 구문

속성 함수에는 세 가지 종류가 있습니다. 각 종류에는 다른 구문이 있습니다.

  • 문자열(인스턴스) 속성 함수
  • 정적 속성 함수
  • MSBuild 속성 함수

문자열 속성 함수

모든 빌드 속성 값은 문자열 값일 뿐입니다. 문자열(인스턴스) 메서드를 사용하여 모든 속성 값에서 작동할 수 있습니다. 예를 들어 다음 코드를 사용하여 전체 경로를 나타내는 빌드 속성에서 드라이브 이름(처음 세 문자)을 추출할 수 있습니다.

$(ProjectOutputFolder.Substring(0,3))

정적 속성 함수

빌드 스크립트에서 여러 시스템 클래스의 정적 속성 및 메서드에 액세스할 수 있습니다. 정적 속성의 값을 얻으려면 다음 구문을 사용합니다. 여기서 Class 시스템 클래스 Property 의 이름과 속성의 이름입니다.

$([Class]::Property)

예를 들어 다음 코드를 사용하여 빌드 속성을 현재 날짜 및 시간으로 설정할 수 있습니다.

<Today>$([System.DateTime]::Now)</Today>

정적 메서드를 호출하려면 다음 구문을 사용합니다. 여기서 Class 시스템 클래스 Method 의 이름은 메서드의 이름이며 (Parameters) 메서드의 매개 변수 목록입니다.

$([Class]::Method(Parameters))

예를 들어 빌드 속성을 새 GUID로 설정하려면 다음 스크립트를 사용할 수 있습니다.

<NewGuid>$([System.Guid]::NewGuid())</NewGuid>

오버로드된 메서드의 경우 MSBuild는 일치하는 매개 변수가 있는 메서드를 찾으려고 합니다.

MSBuild 17.14 이상에서는 매개 변수 구문을 out _ 사용하여 매개 변수를 out 지정할 수 있습니다. 참조 매개 변수를 참조하세요. out 매개 변수 값은 무시됩니다. 다음은 그 예입니다.

<IsInteger>$([System.Int32]::TryParse("123", out _))</IsInteger>

이 속성 IsIntegertrue 입력이 정수로 성공적으로 구문 분석되었지만 구문 분석된 값은 무시되는 경우입니다.

정적 속성 함수에서는 다음 시스템 클래스에 대해 .NET Standard 2.0에 정의된 모든 공용 정적 메서드 또는 속성을 사용할 수 있습니다.

비고

.NET Standard 2.0에 정의되지 않은 메서드 및 속성은 MSBuild를 지원하는 환경에서 사용할 수 있지만 모든 상황에서 사용할 수 있다고 보장할 수는 없습니다. 호환성을 위해 사용하지 않는 것이 가장 좋습니다.

또한 다음 정적 메서드 및 속성을 사용할 수 있습니다.

System.OperatingSystem 속성 함수

속성 함수는 System.OperatingSystem MSBuild가 실행 중인 운영 체제에 대한 정보를 반환합니다. 예를 들어 프로젝트가 Linux를 대상으로 하고 macOS에서 빌드하는 경우 속성 함수는 macOS에 대한 정보를 반환합니다.

.NET(dotnet build)에서 실행되는 MSBuild에서 클래스의 System.OperatingSystem 모든 정적 메서드는 정적 속성 함수로 호출할 수 있습니다.

.NET Framework(MSBuild.exe)에서 실행되는 MSBuild에서는 다음 메서드 System.OperatingSystem 만 정적 속성 함수로 호출할 수 있습니다. MSBuild는 .NET Framework에서 그것들을 정의하지 않기 때문에 내부적으로 System.OperatingSystem를 구현합니다. .NET SDK(예: System.OperatingSystem::IsTvOS)가 없는 운영 체제에 대한 메서드는 호출할 수 없습니다.

다음 예제에서는 이러한 속성 함수의 사용을 보여 줍니다.

<IsWindows>$([System.OperatingSystem]::IsWindows())</IsWindows>

정적 속성에서 인스턴스 메서드 호출

개체 인스턴스를 반환하는 정적 속성에 액세스하는 경우 해당 개체의 인스턴스 메서드를 호출할 수 있습니다. 인스턴스 메서드를 호출하려면 시스템 클래스의 이름, 속성 이름, ClassProperty 메서드 이름 및 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) 두 개의 더블을 추가합니다.
long Add(long a, long b) 두 개의 longs를 추가합니다.
int BitwiseOr(int first, int second) 첫 번째 값과 두 번째 값에 대해 비트 단위 OR 연산을 수행합니다 (첫 번째 | 두 번째).
int BitwiseAnd(int first, int second) 첫 번째와 두 번째(첫 번째 및 두 번째)에서 비트 AND 단위로 수행합니다.
int BitwiseXor(int first, int second) 첫 번째와 두 번째에 대해 비트 XOR 연산을 수행합니다 (첫 번째 ^ 두 번째).
int BitwiseNot(int first) 비트 연산을 NOT (~first) 수행합니다.
string CheckFeatureAvailability(string featureName) 지정된 기능이 이 버전의 MSBuild에서 지원되는 경우에만 기능 이름을 문자열로 반환합니다.
string ConvertToBase64(string toEncode) 모든 바이트를 base 64로 변환한 후 문자열을 반환합니다. 이 문자열은 영숫자 문자와 +, /에 해당하며, 1 또는 2개의 =로 끝납니다.
string ConvertFromBase64(string toDecode) base 64에서 변환한 후 문자열을 반환합니다(영숫자 문자 더하기 +/), 1~2 =로 끝납니다.
double Divide(double a, double b) 두 개의 더블을 나눕니다.
long Divide(long a, long b) 두 개의 롱 정수를 나눕니다.
bool DoesTaskHostExist(string runtime, string architecture) 작업 호스트가 지정된 런타임 및 아키텍처 값에 대해 현재 설치되어 있는지 여부를 반환합니다. MSBuild DoesTaskHostExist를 참조하세요.
string Escape(string unescaped) MSBuild 이스케이프 규칙에 따라 문자열을 이스케이프하십시오.
string EnsureTrailingSlash(string path) 지정된 경로에 후행 슬래시가 없으면 하나를 추가합니다. 경로가 빈 문자열이면 수정하지 않습니다. MSBuild EnsureTrailingSlash를 참조하세요.
string FilterTargetFrameworks(string incoming, string filter) 지정된 필터와 일치하는 대상 프레임워크 목록을 반환합니다. 대상 프레임워크는 incoming에서 filter의 원하는 대상 프레임워크와 일치하는 경우 보존됩니다. MSBuild TargetFramework 및 TargetPlatform 함수를 참조하세요.
string GetCurrentToolsDirectory() 현재 MSBuild 도구 디렉터리를 가져옵니다.
string GetMSBuildExtensionsPath() MSBuild 확장 경로를 가져옵니다. MSBuild.exe실행할 때 일반적으로 MSBuild 실행 폴더입니다. Visual Studio에서 실행하는 경우 Visual Studio 설치 폴더 아래의 MSBuild 하위 폴더입니다.
string GetMSBuildSDKsPath() 현재 MSBuild 인스턴스에 대해 SDK가 필요한 디렉터리를 가져옵니다.
string GetProgramFiles32() 32비트 소프트웨어 패키지가 일반적으로 설치되는 파일 시스템 루트 폴더를 가져옵니다. 예: C:\Program Files (x86).
string GetTargetFrameworkIdentifier(string targetFramework) TargetFramework에서 TargetFrameworkIdentifier를 파싱합니다. MSBuild TargetFramework 및 TargetPlatform 함수를 참조하세요.
string GetTargetFrameworkVersion(string targetFramework, int versionPartCount) TargetFramework에서 TargetFrameworkVersion을 파싱합니다. MSBuild TargetFramework 및 TargetPlatform 함수를 참조하세요.
string GetTargetPlatformIdentifier(string targetFramework) TargetFramework에서 TargetPlatformIdentifier를 구문 분석합니다. MSBuild TargetFramework 및 TargetPlatform 함수를 참조하세요.
string GetTargetPlatformVersion(string targetFramework, int versionPartCount) TargetFramework에서 TargetPlatformVersion을 구문 분석합니다. MSBuild TargetFramework 및 TargetPlatform 함수를 참조하세요.
string GetToolsDirectory32() 32비트 버전의 MSBuild 도구가 있는 디렉터리를 가져옵니다.
string GetToolsDirectory64() 64비트 버전의 MSBuild 도구가 있는 디렉터리를 가져옵니다.
string GetDirectoryNameOfFileAbove(string startingDirectory, string fileName) 지정된 디렉터리 또는 해당 디렉터리 위의 디렉터리 구조에서 파일의 디렉터리를 찾아 반환합니다. MSBuild GetDirectoryNameOfFileAbove를 참조하세요.
string GetPathOfFileAbove(string file, string startingDirectory) 현재 빌드 파일의 위치와 디렉터리 구조 내에서 파일의 전체 경로를 검색하여 반환하거나, startingDirectory가 지정된 경우 이를 기준으로 검색합니다. MSBuild GetPathOfFileAbove를 참조하세요.
object GetRegistryValue(string keyName, string valueName, object defaultValue) 레지스트리 키 및 값의 값을 가져옵니다. MSBuild GetRegistryValue를 참조하세요.
object GetRegistryValueFromView(string keyName, string valueName, object defaultValue, params object[] views) 주어진 레지스트리 키, 값 및 하나 이상의 순서대로 정렬된 레지스트리 뷰에 대해 시스템 레지스트리 데이터를 가져옵니다. MSBuild GetRegistryValueFromView를 참조하세요.
string GetVsInstallRoot() MSBuild의 현재 인스턴스와 연결된 Visual Studio 설치 폴더의 루트에 대한 전체 경로를 가져옵니다.
bool IsOsPlatform(string platformString) 현재 OS 플랫폼이 있는지 여부를 지정합니다 platformString. platformString 는 .의 OSPlatform멤버여야 합니다.
bool IsOsBsdLike() 현재 OS가 BSD 스타일 Unix 시스템인 경우 True입니다.
bool IsOSUnixLike() True이면 현재 OS가 Unix 시스템입니다.
bool IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) 후보 대상 프레임워크(두 번째 인수)가 첫 번째 인수로 표시된 대상 프레임워크와 호환되면 'True'를 반환하고, 그렇지 않으면 false를 반환합니다. MSBuild TargetFramework 및 TargetPlatform 함수를 참조하세요.
int LeftShift(int operand, int count) count비트만큼 왼쪽으로 비트를 이동합니다. MSBuild 17.7 이상.
string MakeRelative(string basePath, string path) path을/를 basePath에 상대적으로 합니다. basePath 는 절대 디렉터리여야 합니다. 상대적으로 만들 수 없는 경우 path는 있는 그대로 반환됩니다. Uri.MakeRelativeUri와 비슷합니다. MSBuild MakeRelative를 참조하세요.
double Modulo(double a, double b) 모둘로 두 개의 복식.
long Modulo(long a, long b) 두 개의 긴 정수에 대한 모듈로 연산.
double Multiply(double a, double b) 두 개의 더블을 곱합니다.
long Multiply(long a, long b) 두 개의 롱 정수를 곱합니다.
string NormalizeDirectory(params string[] path) 제공된 디렉터리의 정식화된 전체 경로를 가져오고 현재 운영 체제에 대한 올바른 디렉터리 구분 기호 문자가 포함되어 있는지 확인하면서 후행 슬래시가 있는지 확인합니다.
string NormalizePath(params string[] path) 제공된 경로의 정식화된 전체 경로를 가져오고 현재 운영 체제에 대한 올바른 디렉터리 구분 기호 문자가 포함되어 있는지 확인합니다.
int RightShift(int operand, int count) 부호 있는 정수를 count 비트만큼 오른쪽으로 이동합니다. MSBuild 17.7 이상.
int RightShiftUnsigned(int operand, int count) 피연산자를 부호 없는 정수로 처리하여 비트만큼 오른쪽으로 count 이동합니다. MSBuild 17.7 이상.
object StableStringHash(string toHash, StringHashingAlgorithm algo) 문자열 인수를 수락하고 안정적으로 보장되는 해시 코드를 반환합니다. MSBuild StableStringHash를 참조하세요.
string SubstringByAsciiChars(string input, int start, int length) 지정된 input 위치에서 시작하여 지정된 start 길이의 length의 ASCII로 인코딩된 문자열의 부분 문자열을 반환합니다.
double Subtract(double a, double b) 두 개의 더블을 뺍니다.
long Subtract(long a, long b) 두 개의 long을 뺍니다.
string Unescape(string escaped) MSBuild 이스케이프 규칙에 따라 문자열 이스케이프를 해제합니다.
string ValueOrDefault(string conditionValue, string defaultValue) 매개 변수가 비어 있는 경우에만 매개 변수 defaultValueconditionValue 의 문자열을 반환하고, 그렇지 않으면 값을 반환합니다 conditionValue. MSBuild ValueOrDefault를 참조하세요.
bool VersionEquals(string a, string b) 버전 truea 이 아래 규칙에 따라 동일하면 반환 b 합니다. MSBuild 버전 비교 함수를 참조하세요.
bool VersionGreaterThan(string a, string b) 버전 true 이 아래 규칙보다 a 큰 경우 반환 b 합니다. MSBuild 버전 비교 함수를 참조하세요.
bool VersionGreaterThanOrEquals(string a, string b) 버전 true이 아래 규칙에 따라 a보다 크거나 같으면 b을 반환합니다. MSBuild 버전 비교 함수를 참조하세요.
bool VersionLessThan(string a, string b) 버전 true 이 아래 규칙에 따라 보다 a 작으면 반환 b 합니다. MSBuild 버전 비교 함수를 참조하세요.
bool VersionLessThanOrEquals(string a, string b) 버전 true 이 아래 규칙에 따라 작거나 같은 a 경우 반환 b 합니다. MSBuild 버전 비교 함수를 참조하세요.
bool VersionNotEquals(string a, string b) 버전 falsea 이 아래 규칙에 따라 동일하면 반환 b 합니다. MSBuild 버전 비교 함수를 참조하세요.

중첩된 속성 함수

다음 예제와 같이 속성 함수를 결합하여 더 복잡한 함수를 구성할 수 있습니다.

$([MSBuild]::BitwiseAnd(32, $([System.IO.File]::GetAttributes(tempFile))))

이 예제에서는 FileAttributes의 값을 반환합니다. Archive 경로 tempFile에서 지정한 파일의 비트(32 또는 0)입니다. 열거된 데이터 값은 일부 컨텍스트에서 이름으로 표시할 수 없습니다. 이전 예제에서는 숫자 값(32)을 대신 사용해야 합니다. 다른 경우에는 호출된 메서드의 기대에 따라 열거형 데이터 값을 사용해야 합니다. 다음 예제에서는 열거형 값 RegexOptions입니다. ECMAScript 는 숫자 값을 이 메서드에서 예상한 대로 변환할 수 없으므로 사용해야 합니다.

<PropertyGroup>
    <GitVersionHeightWithOffset>$([System.Text.RegularExpressions.Regex]::Replace("$(PrereleaseVersion)", "^.*?(\d+)$", "$1", "System.Text.RegularExpressions.RegexOptions.ECMAScript"))</GitVersionHeightWithOffset>
</PropertyGroup>

메타데이터는 중첩된 속성 함수에도 나타날 수 있습니다. 자세한 내용은 Batching참조하세요.

MSBuild DoesTaskHostExist (작업 호스트 존재 여부 확인)

MSBuild의 속성 함수는 DoesTaskHostExist 작업 호스트가 지정된 런타임 및 아키텍처 값에 대해 현재 설치되어 있는지 여부를 반환합니다.

이 속성 함수의 구문은 다음과 같습니다.

$([MSBuild]::DoesTaskHostExist(string theRuntime, string theArchitecture))

MSBuild EnsureTrailingSlash

MSBuild의 속성 함수는 EnsureTrailingSlash 아직 없는 경우 후행 슬래시를 추가합니다.

이 속성 함수의 구문은 다음과 같습니다.

$([MSBuild]::EnsureTrailingSlash('$(PathProperty)'))

MSBuild GetDirectoryNameOfFileAbove (주변 파일의 상위 디렉토리 이름 가져오기)

MSBuild GetDirectoryNameOfFileAbove 속성 함수는 지정된 디렉터리부터 시작하여 지정된 파일을 포함하는 디렉터리를 위쪽으로 검색합니다. 파일이 있으면 파일을 포함하는 가장 가까운 디렉터리의 전체 경로를 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.

이 속성 함수의 구문은 다음과 같습니다.

$([MSBuild]::GetDirectoryNameOfFileAbove(string startingDirectory, string fileName))

이 예제에서는 일치하는 항목이 있는 경우에만 현재 폴더 또는 그 위에 가장 가까운 EnlistmentInfo.props 파일을 가져오는 방법을 보여 줍니다.

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))\EnlistmentInfo.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), EnlistmentInfo.props))' != '' " />

이 예제는 대신 함수를 GetPathOfFileAbove 사용하여 더 간결하게 작성할 수 있습니다.

<Import Project="$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(EnlistmentInfo.props))' != '' " />

MSBuild GetPathOfFileAbove

MSBuild GetPathOfFileAbove 속성 함수는 지정된 디렉터리부터 시작하여 지정된 파일을 포함하는 디렉터리를 위쪽으로 검색합니다. 일치하는 파일이 있으면 일치하는 파일의 전체 경로를 반환하고, 그렇지 않으면 빈 문자열을 반환합니다.

이 속성 함수의 구문은 다음과 같습니다.

$([MSBuild]::GetPathOfFileAbove(string file, [string startingDirectory]))

은 검색 file 할 파일의 이름이며 startingDirectory 검색을 시작할 선택적 디렉터리입니다. 기본적으로 검색은 현재 파일의 자체 디렉터리에서 시작됩니다.

이 예제에서는 일치하는 항목이 있는 경우에만 현재 디렉터리 또는 그 위에 dir.props 라는 파일을 가져오는 방법을 보여 줍니다.

<Import Project="$([MSBuild]::GetPathOfFileAbove(dir.props))" Condition=" '$([MSBuild]::GetPathOfFileAbove(dir.props))' != '' " />

기능적으로 동일한

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" Condition=" '$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))' != '' " />

그러나 현재 파일과 일치하지 않도록 부모 디렉터리에서 검색을 시작해야 하는 경우도 있습니다. 이 예제에서는 Directory.Build.props 파일을 재귀적으로 가져오지 않고 트리의 매우 높은 수준에서 가장 가까운 Directory.Build.props 파일을 가져오는 방법을 보여 줍니다.

<Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

기능적으로 동일한

<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove('$(MSBuildThisFileDirectory)../', 'Directory.Build.props'))/Directory.Build.props" />

MSBuild 레지스트리 값 가져오기

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(dotnet build.NET SDK 버전)에서는 이 함수가 지원되지 않습니다.

MSBuild에서 뷰에서 레지스트리 값을 가져오기 (GetRegistryValueFromView)

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))

앞의 코드는 ReferenceAssemblies 키의 SLRuntimeInstallPath 데이터를 가져오고, 먼저 64비트 레지스트리 보기에서 확인한 다음, 32비트 레지스트리 뷰에서 확인합니다.

경고

MSBuild(dotnet build.NET SDK 버전)에서는 이 함수가 지원되지 않습니다.

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 StableStringHash

MSBuild StableStringHash 속성 함수는 문자열 인수를 허용하고 안정적으로 보장되는 해시 코드를 반환합니다. 즉, 동일한 문자열 입력에 대해 항상 동일한 코드가 반환됩니다. 반환된 해시는 MSBuild dotnet build 사용 여부에 관계없이 동일하며 .NET 메서드 GetHashCode와 달리 플랫폼 아키텍처에서 안정적입니다. 다른 MSBuild 버전에서 안정적으로 유지되는 것은 아닙니다.

이 함수는 MSBuild 16.9.0 이상에서 사용할 수 있습니다.

다음 예제에서는 이 함수를 사용하는 방법을 보여 있습니다.

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

MSBuild 버전 17.10 이상에서 이 함수는 해시 알고리즘을 사용하도록 요청하는 두 번째 선택적 인수를 허용합니다.

<Project>
   <PropertyGroup>
      <MyHash>$([MSBuild]::StableStringHash("test1", "Sha256"))</MyHash>
   </PropertyGroup>

   <Target Name="WriteHash" AfterTargets="Build">
      <Message Text="Hash: $(MyHash)"/>
   </Target>
</Project>

두 번째 인수는 대/소문자를 구분하지 않으며 현재 다음 값을 지원합니다.

  • 레거시 - 두 번째 인수 없이 함수를 호출하는 것과 동일한 동작을 유지합니다. string.GetHashCode와 비슷한 속성을 가진 부호 있는 32비트 정수 값을 반환합니다.
  • Fnv1a32bit - 지정된 문자열 의 버전 '1a' 해시의 Fowler-Noll-Vo 해시 를 나타내는 부호 있는 32비트 정수 값을 반환합니다.
  • Fnv1a64bit - 주어진 문자열의 버전 '1a'의 Fowler-Noll-Vo 해시를 나타내는 부호 있는 64비트 정수를 반환합니다.
  • Sha256 - 지정된 문자열의 SHA256 해시를 나타내는 접두사 없는 16진수 문자열을 반환합니다.

MSBuild 값 또는 기본값

MSBuild ValueOrDefault 속성 함수는 null이거나 비어 있지 않으면 첫 번째 인수를 반환합니다. 첫 번째 인수가 null이거나 비어 있으면 함수는 두 번째 인수를 반환합니다.

다음 예제에서는 이 함수를 사용하는 방법을 보여 있습니다.

<Project>

    <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
-->

MSBuild TargetFramework 및 TargetPlatform 함수

MSBuild 16.7 이상은 TargetFramework 및 TargetPlatform 속성을 처리하기 위한 여러 함수를 정의합니다.

함수 시그니처 설명
FilterTargetFrameworks(string incoming, string filter) 지정된 필터와 일치하는 대상 프레임워크 목록을 반환합니다. 대상 프레임워크는 incoming에서 filter의 원하는 대상 프레임워크와 일치하는 경우 보존됩니다.
GetTargetFrameworkIdentifier(string targetFramework) TargetFramework에서 TargetFrameworkIdentifier를 파싱합니다.
GetTargetFrameworkVersion(string targetFramework, int versionPartCount) TargetFramework에서 TargetFrameworkVersion을 파싱합니다.
GetTargetPlatformIdentifier(string targetFramework) TargetFramework에서 TargetPlatformIdentifier를 구문 분석합니다.
GetTargetPlatformVersion(string targetFramework, int versionPartCount) TargetFramework에서 TargetPlatformVersion을 구문 분석합니다.
IsTargetFrameworkCompatible(string targetFrameworkTarget, string targetFrameworkCandidate) 후보 대상 프레임워크(두 번째 인수)가 첫 번째 인수로 표시된 대상 프레임워크와 호환되면 true를 반환하고, 그렇지 않으면 false를 반환합니다.

versionPartCount 의 매개 변수 GetTargetFrameworkVersion 이며 GetTargetPlatformVersion 기본값은 2입니다.

다음 예제에서는 이러한 함수를 사용하는 방법을 보여 줍니다.

<Project>

    <PropertyGroup>
        <Value1>$([MSBuild]::GetTargetFrameworkIdentifier('net5.0-windows7.0'))</Value1>
        <Value2>$([MSBuild]::GetTargetFrameworkVersion('net5.0-windows7.0'))</Value2>
        <Value3>$([MSBuild]::GetTargetPlatformIdentifier('net5.0-windows7.0'))</Value3>
        <Value4>$([MSBuild]::GetTargetPlatformVersion('net5.0-windows7.0'))</Value4>
        <Value5>$([MSBuild]::IsTargetFrameworkCompatible('net5.0-windows', 'net5.0'))</Value5>
        <Value6>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net6.0'))</Value6>
        <Value7>$([MSBuild]::IsTargetFrameworkCompatible('net5.0', 'net8.0'))</Value7>
        <Value8>$([MSBuild]::IsTargetFrameworkCompatible('net8.0', 'net6.0'))</Value8>
    </PropertyGroup>

    <Target Name="MyTarget">
        <Message Text="Value1 = $(Value1)" />
        <Message Text="Value2 = $(Value2)" />
        <Message Text="Value3 = $(Value3)" />
        <Message Text="Value4 = $(Value4)" />
        <Message Text="Value5 = $(Value5)" />
        <Message Text="Value6 = $(Value6)" />
        <Message Text="Value7 = $(Value7)" />
        <Message Text="Value8 = $(Value8)" />
    </Target>
</Project>
Value1 = .NETCoreApp
Value2 = 5.0
Value3 = windows
Value4 = 7.0
Value5 = True
Value6 = False
Value7 = False
Value8 = True

MSBuild 타겟 프레임워크 필터링

MSBuild 17.6 이상(또는 .NET 7 이상)에서는 이 속성 함수를 사용하여 TFM(대상 프레임워크 모니커) 목록의 하위 집합을 선택하여 필터 인수가 지정된 TFM 목록과 일치하는 프레임워크로 목록을 제한할 수 있습니다.

예를 들어, incomingnet6.0;net7.0;netstandard2.0이고 filternet7.0;netstandard2.0이면 결과는 net7.0;netstandard2.0입니다.

MSBuild 버전 비교 함수

MSBuild 16.5 이상은 버전을 나타내는 문자열을 비교하기 위한 여러 함수를 정의합니다.

비고

조건에서 비교 연산자는 개체로 구문으로 변환할 수 있는 문자열을 비교할 수 있지만, 이러한 비교는 상황에서 예기치 않은 결과를 초래할 수 있습니다. 속성 함수를 선호합니다.

함수 시그니처 설명
VersionEquals(string a, string b) 버전 truea 이 아래 규칙에 따라 동일하면 반환 b 합니다.
VersionGreaterThan(string a, string b) 버전 true 이 아래 규칙보다 a 큰 경우 반환 b 합니다.
VersionGreaterThanOrEquals(string a, string b) 버전 true이 아래 규칙에 따라 a보다 크거나 같으면 b을 반환합니다.
VersionLessThan(string a, string b) 버전 true 이 아래 규칙에 따라 보다 a 작으면 반환 b 합니다.
VersionLessThanOrEquals(string a, string b) 버전 true 이 아래 규칙에 따라 작거나 같은 a 경우 반환 b 합니다.
VersionNotEquals(string a, string b) 버전 falsea 이 아래 규칙에 따라 동일하면 반환 b 합니다.

이러한 메서드에서는 System.Version와 같이 구문 분석되며, 다음의 예외 사항을 제외합니다.

  • 선행 v 또는 V가 무시되어 $(TargetFrameworkVersion)와 비교할 수 있습니다.

  • 첫 번째 '-' 또는 '+'에서 버전 문자열의 끝까지 모든 항목이 무시됩니다. 따라서 순서가 semver와 같지는 않지만 의미 체계 버전(semver)을 전달할 수 있습니다. 대신 시험판 지정자와 빌드 메타데이터에는 정렬 가중치가 없습니다. 예를 들어 >= x.y 기능을 활성화하고, x.y.z-pre에 작동하기 시작하도록 하는 것이 유용할 수 있습니다.

  • 지정되지 않은 부분은 값이 0인 부분과 같습니다. (x == x.0 == x.0.0 == x.0.0.0).

  • 정수 구성 요소에서는 공백을 사용할 수 없습니다.

  • 주 버전만 유효합니다(3 같음 3.0.0.0).

  • +는 정수 구성 요소에서 양의 부호로 허용되지 않습니다(semver 메타데이터로 처리되어 무시됩니다).

팁 (조언)

TargetFramework 속성의 비교는 일반적으로 버전을 추출하고 비교하는 대신 IsTargetFrameworkCompatible을 사용해야 합니다. 버전과 다양한 TargetFramework이 포함된 TargetFrameworkIdentifier들을 비교할 수 있습니다.

MSBuild 조건 함수

함수 Exists 이며 HasTrailingSlash 속성 함수가 아닙니다. Condition 속성과 함께 사용할 수 있습니다. MSBuild 조건참조하세요.